使用MAX获取MAX值的行

时间:2016-03-03 15:28:02

标签: sql postgresql greatest-n-per-group

我有一个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(或其他聚合函数) )以及。

1 个答案:

答案 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的总和。