PostgreSQL equivalente de n SUPERIOR CON LAZOS:LÍMITE "con lazos"?
-
09-12-2019 - |
Pregunta
Estoy buscando algo similar a esto en SQL Server:
SELECT TOP n WITH TIES FROM tablename
Yo sé acerca de LIMIT
en PostgreSQL, pero no el equivalente de los anteriores existen?Tengo curiosidad como se ahorraría un extra de consulta cada vez para mí.
Si tengo una tabla Numbers
con el atributo nums
: {10, 9, 8, 8, 2}
.Quiero hacer algo como:
SELECT nums FROM Numbers ORDER BY nums DESC LIMIT *with ties* 3
Debe devolver {10, 9, 8, 8}
porque tiene el top 3 más el extra 8
ya que los lazos de la otra.
Solución
No hay WITH TIES
la cláusula en PostgreSQL como la hay en la SQL Server.
En PostgreSQL me gustaría sustituir este 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 equivocado (retorno demasiadas filas).
Considere esta cita de SQL Server docs (desde el enlace de arriba):
Por ejemplo, si la expresión es del 5 pero 2 filas adicionales coinciden con los los valores de la ORDEN de las columnas en la fila 5, el conjunto de resultados contendrá 7 las filas.
El trabajo de WITH TIES
es incluir a todos los compañeros de la última fila en la parte superior n como se define por la ORDER BY
la cláusula. rank()
da exactamente el mismo resultado.
Para asegurarse, he probado con SQL server, aquí es un demostración en vivo.
Y aquí es más conveniente SQLfiddle.
Otros consejos
Intente esto:
Salida:10, 9, 8, 8
with numbers (nums) as (
values (10), (9), (8), (8), (2)
)
SELECT nums FROM Numbers
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC
Salida:10,10,9,8,8
with numbers (nums) as (
values (10), (9), (8), (8), (2), (10)
)
SELECT nums FROM Numbers
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC