2011-04-04 73 views
26

¿Cómo obtener el número de fila en PostgreSQL cuando los resultados son ordenados por alguna columna?Numeración de filas en PostgreSQL

p. Ej.

SELECT 30+row_number() AS position, * 
FROM users 
ORDER BY salary DESC 
LIMIT 30 
OFFSET 30 

que supone que la consulta sería la lista de volver de esta manera:

position | name | salary 
31  | Joy | 4500 
32  | Katie| 4000 
33  | Frank| 3500 

En realidad tengo que duplicar la cláusula ORDER en la consulta para que sea funcional:

SELECT 30+row_number(ORDER BY salary DESC) AS position, * 
FROM users 
ORDER BY salary DESC 
LIMIT 30 
OFFSET 30 

¿Hay de otra manera, ¿cómo devolver resultados ordenados y numerados sin la necesidad de duplicar el código?

Sé que esto puede ser resuelto mediante el incremento de alguna variable en la aplicación en sí, pero lo que quiero hacer esto en la capa de base de datos y volver a la aplicación ya numerada resultados ...

Respuesta

37

no - el order by en el de ventanas función y la order by cláusula de la declaración select son funcionalmente dos cosas diferentes.

Además, su sentencia produce: ERROR: window function call requires an OVER clause, por lo que:

SELECT 30+row_number(ORDER BY salary DESC) AS position, * FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30 

debería ser:

SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, * FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30 

Tenga en cuenta que si los salarios no son únicos, entonces no hay garantía de que incluso producir la misma orden. Tal vez sería mejor que hacer:

SELECT * 
FROM (SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, * 
     FROM users) 
ORDER BY position LIMIT 30 OFFSET 30 

También tenga en cuenta que si está ejecutando esta consulta varias veces con distintos desplazamientos, es necesario:

  1. configurar su isolation level a serializable
  2. asegurarse que sea lo que sea que esté ordenando es único

o puede obtener filas duplicadas y faltantes. Vea los comentarios en this answer para saber por qué.

+0

"lectura repetible de nivel de aislamiento" es todo lo que necesita ... pero de cualquier forma, debe asegurarse de que la conexión y la transacción permanezcan abiertas ... lo que podría ser muy difícil de hacer, dependiendo de la aplicación. –

Cuestiones relacionadas