1

我正在使用 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 中最后一行的更好方法吗?

4

2 回答 2

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将找到分区内行的最大值等。

于 2013-07-25T14:14:24.197 回答
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子句,这只是一个符号方便,所以我不必两次拼出窗口定义。

于 2013-07-25T16:41:15.913 回答