2012-03-09 10 views
9

Busco algo similar esta en SQL Server:Equivalente a PostgreSQL para TOP n CON LAZOS: ¿LIMITAR "con lazos"?

SELECT TOP n WITH TIES FROM tablename 

que saber sobre LIMIT en PostgreSQL, pero tiene el equivalente de la anterior existen? Solo tengo curiosidad ya que me ahorraría una consulta extra cada vez.

Si tengo una tabla con el atributo Numbersnums: {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 toma la parte superior 3 más el extra de 8 ya que ata el otro.

Respuesta

8

No hay WITH TIES cláusula en PostgreSQL como en el SQL Server.
En PostgreSQL que sustituiría esto para 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 que quede claro, rank() es correcto, dense_rank() sería un error (retorno demasiadas filas).
Considere esta cita de la documentación de SQL Server (desde el enlace de arriba):

Por ejemplo, si la expresión se establece en 5, pero 2 filas adicionales que coincida con las valores de la orden por columnas en la fila 5, la El conjunto de resultados contendrá 7 filas.

El trabajo de WITH TIES es incluir todos los pares de la última fila de la parte superior n como se define por la cláusula ORDER BY. rank() da el mismo resultado exacto.

Para estar seguro, probé con el servidor SQL, aquí hay un live demo.
Y aquí hay una más conveniente SQLfiddle.

+1

¿Por qué este complicado? La función rank() hará exactamente lo que se requiere? –

+0

@a_horse_with_no_name: Tiene toda la razón (al igual que yo, al principio) Mis segundas consideraciones fueron innecesarias. –

+0

@Erwin: eso es bueno (http://data.stackexchange.com/stackoverflow/query/63525/top-n-with-ties), no sabía que stackoverflow tiene un módulo integrado para ejecutar consultas :-) Aunque la salida de 10,10,9 para 10,9,8,8,2,10 es incorrecta si necesita obtener los 3 primeros (10,9,8) y enumerar todos los 10,9,8; que debería ser: 10,10,9,8,8. 'WITH TIES' puede ser incorrecto para un caso de problema dado: http://stackoverflow.com/questions/2611822/distinct-with-count-and-sql-server-2005/2612456#2612456 –

2

Prueba esto:

de 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 
Cuestiones relacionadas