SQL:查找最大元组

时间:2015-12-28 14:14:02

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

在PostgreSQL中,我有一个包含以下值的表:

year | month | val
-----|-------|------
2014 |    1  |   x
2014 |   12  |   y
2015 |    1  |   z

年和月之间存在层次关系,我想找到最大元组(年,月)的val。因此,在此示例中,我想返回val' z',因为2015年是最大年份,1是该年内的最大月份。这可以通过内部查询来实现:

SELECT val
FROM (
    SELECT val, row_number() OVER (ORDER BY YEAR DESC, MONTH DESC) AS r
    FROM test
) foo
WHERE r=1

参见http://sqlfiddle.com/#!15/17fb6/16 但有没有更简单,更简洁的方法呢?

2 个答案:

答案 0 :(得分:2)

ORDER BYLIMIT 1

一起使用
SELECT val
FROM test
ORDER BY year DESC, month DESC
LIMIT 1;

答案 1 :(得分:0)

您可以通过执行自我半连接(例如:

)来解决所有问题(如果使用ORDER会发生这种情况)。
SELECT year, month, val FROM test t1 WHERE NOT EXISTS (
  SELECT 1 FROM test t2 
  WHERE (t2.year = t1.year AND t2.month > t1.month) OR 
         t2.year > t1.year)

请注意,如果存在关联,则会为您提供所有最大值元组。如果你想要一行,你可以在exists子句中输入OR (t1.year = t2.year AND t1.month = t2.month AND t2.ctid > t1.ctid)