Rownum в postgresql


Відповіді:


90

Postgresql> 8.4

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

13
Будь обережний. Це схоже на оракул, але це дещо інше. Rownum Oracle присвоюється під час читання рядка з диска, тоді як this row_number () присвоюється залежно від того, що у вас в OVER
Ройс

А як щодо різниці швидкості?
Нашев

26

Я щойно протестував у Postgres 9.1 рішення, близьке до Oracle ROWNUM:

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

4
Зверніть увагу, що це не стосуватиметься ORDER BYзовнішнього запиту.
Гордон Лінофф

24

Postgresql має обмеження.

Код Oracle:

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;

Можливо, це не найшвидший, але це варіант, якщо вони вам дійсно потрібні.


2

Postgresql не має еквівалента ROWNUM від Oracle. У багатьох випадках ви можете досягти того самого результату, використовуючи LIMIT та OFFSET у своєму запиті.


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

0

використовуйте обмежувальну клаузулу зі зміщенням, щоб вибрати номер рядка -1, тому, якщо ви хочете отримати рядок номер 8, використовуйте:

обмеження 1 зміщення 7

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.