2010-10-18 29 views

Respuesta

71

PostgreSQL> 8,4

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

tener cuidado. Esto es similar al Rownum de Oracle, pero es ligeramente diferente. El Rownum de Oracle se asigna al momento de leer la fila desde el disco, mientras que este row_number() se asigna dependiendo de lo que haya en OVER – Royce

+0

¿Qué pasa con las diferencias de velocidad? – Nashev

2

Postgresql no tiene un equivalente de ROWNUM de Oracle. En muchos casos, puede obtener el mismo resultado utilizando LIMIT y OFFSET en su consulta.

+0

-1 Eso parece estar mal, ver la respuesta aceptada ... –

+3

1 ROWNUM y ROW_NUMBER() OVER() no son exactamente la misma –

9

Si lo que desea es un número que vuelva probar esto.

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

se puede añadir un pedido por al SQL inline_v1 por lo que su ROWNUM tiene algún significado secuencial a los datos.

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

podría no ser el más rápido, pero es una opción si realmente los necesita.

18

acabo de prueba en Postgres 9.1 una solución que está cerca de Oracle ROWNUM:

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

Probé esto en 8.4 y funciona allí también. – Mac

+3

Tenga en cuenta que esto no respetará un 'ORDER BY' en la consulta externa. –

7

Postgresql tienen límite.

código de Oracle:

select * 
from 
    tbl 
where rownum <= 1000; 

misma en el código de PostgreSQL:

select * 
from 
    tbl 
limit 1000 
0

utilizan la cláusula de límite, con el desplazamiento para elegir el número de fila -1 así que si quieren conseguir la fila número 8 a fin de utilizar:

límite de 1 compensado 7

0

Si tiene una clave única, es posible utilizar 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 | 

DEMO