如何在PostgreSQL查询中显示行号?

vol*_*ron 70 sql database postgresql

我想显示PostgreSQL查询返回的每条记录的观察数.

我认为在8.4窗口函数中可以执行此功能.

vol*_*ron 103

select   row_number() over (order by <field> nulls last) as rownum, *
from     foo_tbl
order by <field>
Run Code Online (Sandbox Code Playgroud)

如果没有必要订购,这个答案也可以简化:

select row_number() over(), *  -- notice: no fields are needed
from   foo_tbl
Run Code Online (Sandbox Code Playgroud)

  • 看起来,如果你执行 `over()` 那么它总是递增地给出 rownumbers,比如 `1 2 3 4...` *按该特定结果的顺序*(如果有重新排列结果的外部查询,那么 rownum 可能会变成乱序参考:http://stackoverflow.com/a/4812038/32453,因此在这些情况下添加“order by”可能很有用(或者如果您不想像第一个示例中那样计算空值)。FWIW . (2认同)
  • @ zthomas.nc是一个窗口函数.想象一下熟悉的玻璃窗.如果你愿意,可以将该窗口划分为较小的窗格(框架),所有结果仍然是唯一的,但是在帧之间划分.这种划分就是所谓的分区,它就是`over()`所做的.如果您没有提供任何条件,整个窗口都会有一个窗格."窗函数"是唯一的,因为它们可以跨帧的行进行计算,而不是整个结果集.因此,如果你想按性别做"row_number",你可以使用你的性别划分. (2认同)

vol*_*ron 5

对于8.4之前的版本:

SELECT    count(*) rownum, foo.*
FROM      datatable foo
JOIN      datatable bar
          ON (foo.pk_id < bar.pk_id)
GROUP BY  foo.pk_id, foo.a, foo.b
ORDER BY  rownum
;

-- if there isn't a single unique/primary key field, you can concatenate fields
--    Example: ON (foo.a||foo.b||foo.c < bar.a||bar.b||bar.c)
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人.

  • 窗口函数是SQL:2003标准的一部分. (2认同)