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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top