SQL在一个月内选择,但一天中超过三组时,仅显示前三组的所有数据

问题描述 投票:0回答:1

我有这样的数据。我想搜索11月的所有数据。并按日期和组进行排序。但是当一天超过3组时,则仅显示前3组。

对不起,我是SQL的新手。我不知道要按组选择。

示例数据

id(pkey)    group   name    date

1             1     A001    11/1
2             2     A002    11/1
3             3     A003    11/1
4             4     A004    11/1
5             5     A005    11/1
6             1     A006    11/1
7             2     A007    11/1
8             3     A008    11/1
9             4     A009    11/1
10            5     A010    11/1
11            1     A011    11/2
12            2     A012    11/2
13            3     A013    11/2
14            4     A014    11/2
15            5     A015    11/2
16            1     A016    11/2
17            2     A017    11/2
18            3     A018    11/2
19            4     A019    11/2
20            5     A020    11/2
…             …     …       …

这样的结果。

group   name    date
1       A001    11/1
1       A006    11/1
2       A002    11/1
2       A007    11/1
3       A003    11/1
3       A008    11/1
1       A011    11/2
1       A016    11/2
2       A012    11/2
2       A017    11/2
3       A013    11/2
3       A018    11/2
sql postgresql greatest-n-per-group
1个回答
0
投票

[使用一个子查询以IN返回每天的前3组:

select t.* 
from tablename t
where t."group" in (
  select distinct "group" from tablename 
  where "date" = t."date" 
  order by "group" limit 3
)
order by t."date", t."group", t."name"

请参见demo。结果:

> id | group | name | date
> -: | ----: | :--- | :---
>  1 |     1 | A001 | 11/1
>  6 |     1 | A006 | 11/1
>  2 |     2 | A002 | 11/1
>  7 |     2 | A007 | 11/1
>  3 |     3 | A003 | 11/1
>  8 |     3 | A008 | 11/1
> 11 |     1 | A011 | 11/2
> 16 |     1 | A016 | 11/2
> 12 |     2 | A012 | 11/2
> 17 |     2 | A017 | 11/2
> 13 |     3 | A013 | 11/2
> 18 |     3 | A018 | 11/2

0
投票

您可以使用dense_rank()

select
    "group", name, date
from (
    select t.*, dense_rank() over(partition by date order by "group") rn
    from mytable 
) t
where rn <= 3
© www.soinside.com 2019 - 2024. All rights reserved.