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.