我想显示一个PostgreSQL查询返回的每条记录的观察数。
我认为在8.4窗口功能可以执行此功能。
我想显示一个PostgreSQL查询返回的每条记录的观察数。
我认为在8.4窗口功能可以执行此功能。
Answers:
select row_number() over (order by <field> nulls last) as rownum, *
from foo_tbl
order by <field>
如果不需要订购,则也可以简化此答案:
select row_number() over(), * -- notice: no fields are needed
from foo_tbl
SQL提琴概念证明
over()
它将始终递增地提供行号,例如1 2 3 4...
按照该特定结果的顺序(如果有外部查询会重新排列结果,则rownum可能会出现混乱,请参考:stackoverflow.com/a/4812038/32453,因此添加order by
可能会在这种情况下非常有用(或者,如果你想不算空值,如在第一个例子)FWIW。
over()
上述分区。如果您没有提供任何条件,则整个窗口只有一个窗格。Window functions
之所以独特,是因为它们可以跨一帧的行而不是整个结果集进行计算。因此,如果您想row_number
按性别来做,则可以使用over按性别进行划分。
对于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)
希望这对某人有帮助。
SQL提琴概念证明
我建议不惜一切代价避免这样做,但想将其包括在内。它有些昂贵,我想它不能很好地扩展,但是当表上不存在主键时(错误的db-design),您的选择可能会受到限制。在大多数情况下,建议在应用程序层执行编号。
-- Based on basic table w/o primary key
-- CREATE TABLE names ( name as text );
SELECT num, name[num]
FROM (
select generate_series( 1, (select count(*) from names) ) as num
) _nums,
(
select array_agg(name) as name from names
) _names
SQL提琴概念证明
无法扩展的原因:
null
值应该与一致null
。因此,coalesce()
可能需要使用a。