sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL 13:LÍMITE… CON LAZOS

Una de las nuevas funciones de PostgreSQL 13 es el estándar SQL WITH TIES cláusula para usar con LIMIT — o, como lo llama el estándar, FETCH FIRST n ROWS . Gracias a Surafel Temesgen como autor del parche inicial; Tomas Vondra y su servidor por algunas correcciones de código adicionales; y los revisores Andrew Gierth y Erik Rijkers. Puede examinar el mensaje de confirmación.

Los empates son muy frecuentes a la hora de clasificar las cosas; por ejemplo, en una carrera de caucus podrías tener muchos empates, ¡y seguro que no querrás privar a los participantes de sus premios! Que WITH TIES es bastante simple:agrega cualquier fila o filas siguientes a su conjunto de resultados, si se clasifican igual a la última fila devuelta por el LIMIT cláusula, según el ORDER BY cláusula.

Si desea solo a los dos empleados con el salario más alto, puede hacer lo siguiente:

SELECT * FROM employees
ORDER BY salary DESC LIMIT 2;
nombre salario departamento
Alicia 1600 ingeniería
Oruga 1500 márketing

Entonces, ¿estás ansioso por saber el salario de la siguiente persona? ¿Qué pasa si coincide con Oruga y se quedó fuera por pura casualidad o mala suerte? Eso puede pasar, como bien sabes; y afortunadamente, WITH TIES ahora está ahí para salvar el día. (Tenga en cuenta que, en realidad, no manejamos WITH TIES en el LIMIT cláusula como tal. Tienes que usar el FETCH FIRST sintaxis, que es la exigida por los estándares, para poder usar WITH TIES .)

SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES;
nombre salario departamento
Alicia 1600 ingeniería
Oruga 1500 ventas
Conejo Blanco 1500 márketing

¡Allá! Conejo Blanco tenía estar en la lista, y ahora lo está.

Un par de notas antes de que te vuelvas demasiado loco. LIMIT (o más precisamente FETCH FIRST ) ya no promete devolver exactamente el número de filas que especifique. Puede obtener dos o veinte filas adicionales, o 100 veces más filas de las que solicitó. Entre otras cosas, esto significa que debe realizar un seguimiento de cuántas filas ha visto hasta ahora, si está paginando los resultados. En lo anterior, tiene tres filas, por lo que para la página siguiente se salta ese número agregando el OFFSET correcto cláusula:

SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3;
nombre salario departamento
Falsa Tortuga 1400 márketing
Duquesa 1300 ventas
Liebre de Marzo 1300 ingeniería

Nuevamente obtuvimos tres en lugar de solo dos que pedimos. Así que para la siguiente página tendrías que saltarte seis. Y así. Asegúrese de tener suficientes dedales para todos.

La otra cosa a tener en cuenta es que debes asegurarte de usar solo el ORDER BY cláusula que conviene a WITH TIES cláusula; si quisiera, digamos, tener las filas del mismo salario ordenadas por nombre, tendría que usar una subconsulta. De lo contrario, la distinción de nombres resolvería el empate en el salario, por lo que no se incluiría la siguiente fila. Por ejemplo:

SELECT * FROM (
       SELECT * FROM employees
       ORDER BY salary DESC
       FETCH FIRST 2 ROWS WITH TIES) AS subq
ORDER BY salary DESC, name;

Esta función está ahí para ayudarlo a mostrar todas las filas que tienen el mismo valor; le permite no discriminar algunas filas de igual valor basándose únicamente en la ubicación física dentro de la tabla.

¡Feliz paginación!