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

Equivalente de PostgreSQL para TOP n CON LAZOS:¿LÍMITE con lazos?

Postgres 13 finalmente agrega WITH TIES . Ver:

  • Mayor o igual que ALL() e igual a MAX() velocidad

No hay WITH TIES cláusula hasta PostgreSQL 12, como hay en SQL Server.
En PostgreSQL, sustituiría esto por TOP n WITH TIES .. ORDER BY <something> :

WITH cte AS (
   SELECT *, rank() OVER (ORDER BY <something>) AS rnk
   FROM   tbl
   )
SELECT *
FROM   cte
WHERE  rnk <= n;

Para ser claros, rank() es correcto, dense_rank() sería incorrecto (devolvería demasiadas filas).
Considere esta cita de los documentos de SQL Server (del enlace anterior):

Por ejemplo, si expresión se establece en 5 pero 2 filas adicionales coinciden con los valores de las columnas ORDENAR POR en la fila 5, el conjunto de resultados contendrá 7 filas.

El oficio de WITH TIES es incluir todos los pares de la última fila en la parte superior n según lo definido por ORDER BY cláusula. rank() da exactamente el mismo resultado.

Para asegurarme, probé con el servidor SQL, aquí hay una demostración en vivo.
Y aquí hay un SQLfiddle más conveniente.