SQL GROUP BY问题

时间:2011-01-12 09:50:07

标签: sql postgresql group-by

我有一张桌子:

id group data
1  a     10
2  a     20
3  b     10
4  b     20

我想获取具有按“组”分组的最大“数据”值的记录ID,即

id
2
4

3 个答案:

答案 0 :(得分:5)

使用CTE的更现代的答案:

;WITH Numbered as (
    SELECT ID,ROW_NUMBER() OVER (PARTITION BY group ORDER BY data desc) rn FROM Table
)
SELECT ID from Numbered where rn=1

PostgreSQL在线有一些相当不错的文档,请查看window functionsWITH queries。在这种情况下,我们根据它们所属的组对表中的行进行分区。在每个分区中,我们根据数据列对行进行编号(行号1分配给最高数据值)。

在外部查询中,我们只询问在其分区中分配了行号1的行,如果您遵循逻辑,则它必须是每个组中的最大数据值。

如果您需要处理关系(即,如果组中的多个行都具有该组的最大数据值,并且您希望两者都显示在结果集中),则可以从ROW_NUMBER()切换到RANK()

答案 1 :(得分:4)

便携式解决方案:

SELECT T1.id
FROM yourtable T1
JOIN (
    SELECT grp, MAX(data) AS data
    FROM yourtable
    GROUP BY grp
) T2
WHERE T1.grp = T2.grp AND T1.data = T2.data

PostgreSQL解决方案:

SELECT DISTINCT ON (grp) id
FROM yourtable
ORDER BY grp, data DESC;

PS:我将列名从group更改为grp,因为group是保留字。如果确实想要使用group,则必须引用它。

答案 2 :(得分:0)

SELECT Id
FROM Table t1 JOIN (Select Group, Max(Data) Data from Table 
                   group by group) t2
WHERE t1.Group = t2.Group
  AND t1.Data = t2.Data