我有一个PostgreSQL表example
,其中有三列:a INT, b INT, c TEXT
。
对于a
的每个值,我希望c
具有最高值b
,以及所有b
的总和。类似的东西(如果有ARGMAX功能):
SELECT a, ARGMAX(c for MAX(b)), SUM(b) FROM example GROUP BY a
我发现很多解决方案都有不同的技术来获取ARGMAX位,但它们似乎都没有使用GROUP BY,所以我想知道我们最有效的方法是捕获SUM(或其他聚合函数) )以及。
答案 0 :(得分:2)
使用窗口函数可以轻松实现:
SELECT a, b, c, s
FROM (
SELECT a, b, c,
ROW_NUMBER() OVER (PARTITION BY a ORDER BY b DESC) AS rn,
SUM(b) OVER (PARTITION BY a) AS s
FROM example) AS t
WHERE t.rn = 1
ROW_NUMBER
枚举每个a
分区中的记录:具有最高b
值的记录被赋值为1,下一个记录值为2,等等。SUM(b) OVER (PARTITION BY a)
返回每个b
分区中所有a
的总和。