PostgreSQL中的行数


Answers:


90

PostgreSQL> 8.4

SELECT 
    row_number() OVER (ORDER BY col1) AS i, 
    e.col1, 
    e.col2, 
    ... 
FROM ... 

13
小心。这类似于oracle的rownum,但略有不同。Oracle的rownum是在从磁盘读取行时分配的,而row_number()的分配则取决于OVER中的内容
Royce

速度差异如何?
纳什夫

26

我刚刚在Postgres 9.1中测试了一种接近Oracle ROWNUM的解决方案:

select row_number() over() as id, t.*
from information_schema.tables t;

4
请注意,这将不涉及ORDER BY外部查询中的。
Gordon Linoff '16

24

PostgreSQL有限制。

甲骨文的代码:

select *
from
  tbl
where rownum <= 1000;

在Postgresql的代码中相同:

select *
from
  tbl
limit 1000

8

如果您只想返回一个数字,请尝试此操作。

create temp sequence temp_seq;
SELECT inline_v1.ROWNUM,inline_v1.c1
FROM
(
select nextval('temp_seq') as ROWNUM, c1 
from sometable
)inline_v1;

您可以通过向inline_v1 SQL添加订单,以便您的ROWNUM对数据具有一定的顺序含义。

select nextval('temp_seq') as ROWNUM, c1 
from sometable
ORDER BY c1 desc;

可能不是最快的,但是如果您确实需要它们,则可以选择。



1

如果您有唯一的密钥,则可以使用 COUNT(*) OVER ( ORDER BY unique_key ) as ROWNUM

SELECT t.*, count(*) OVER (ORDER BY k ) ROWNUM 
FROM yourtable t;

| k |     n | rownum |
|---|-------|--------|
| a | TEST1 |      1 |
| b | TEST2 |      2 |
| c | TEST2 |      3 |
| d | TEST4 |      4 |

演示


这正是我的确切需求,它解决了我的问题。谢谢!!
dbusern

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.