检测组的最后一行

时间:2013-07-25 13:59:27

标签: sql postgresql

我使用row_number()通过创建降序并检查我是否在第1位来确定查询的最后一行。

row | value
----+-------
  3 | false
  2 | false
  1 | true

您是否知道如何应用相同的技术来确定每个组的最后一行?

预期结果应如下:

uid | row | value
----+-----+-------
  1 |   3 | false
  1 |   2 | false
  1 |   1 | true
  2 |   4 | false
  2 |   3 | false
  2 |   2 | false
  2 |   1 | true
  3 |   2 | false
  3 |   1 | true

或者你知道检测PostgreSQL中最后一行的更好方法吗?

2 个答案:

答案 0 :(得分:2)

使用PARTITION BY作为OVER()的一部分:

select uid,something,
  ROW_NUMBER() OVER (PARTITION BY uid ORDER BY something desc) as row
from
  someTable

PARTITION BY会导致您正在使用的任何窗口函数(例如ROW_NUMBER())在已定义的每个分区上单独运行完成 - 因此ROW_NUMBER重新启动数字MAX会找到分区内行的最大值等。

答案 1 :(得分:1)

要在没有其他子查询的情况下实际确定每组(或整体)的最后一行,可以使用窗口函数lead()。这对于不那么微不足道的升序情况也适用:

SELECT uid, something
      ,row_number() OVER w AS row
      ,lead (TRUE, 1, FALSE) OVER w AS value
FROM  tbl
WINDOW w AS (PARTITION BY uid ORDER BY something DESC) 
当组中没有找到“下一行”时,

lead()具有提供默认值的第三个参数的很少使用的功能。这样,您可以为具有“下一行”行的行返回常量TRUE,并替换FALSE其他行。

我也在使用WINDOW子句,这只是一个符号方便,所以我不必两次拼出窗口定义。