我有一张桌子:
id group data
1 a 10
2 a 20
3 b 10
4 b 20
我想获取具有按“组”分组的最大“数据”值的记录ID,即
id
2
4
答案 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 functions和WITH 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