我使用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中最后一行的更好方法吗?
答案 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
子句,这只是一个符号方便,所以我不必两次拼出窗口定义。