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!