PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Equivalente a PostgreSQL per TOP n CON TIES:LIMIT con legami?

Postgres 13 infine aggiunge WITH TIES . Vedi:

  • Maggiore o uguale a ALL() e uguale a MAX() velocità

Non ci sono WITH TIES clausola fino a PostgreSQL 12, come in SQL Server.
In PostgreSQL lo sostituirei con 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;

Per essere chiari, rank() ha ragione, dense_rank() sarebbe sbagliato (restituire troppe righe).
Considera questa citazione dai documenti di SQL Server (dal link sopra):

Ad esempio, se l'espressione è impostata su 5 ma 2 righe aggiuntive corrispondono ai valori delle colonne ORDER BY nella riga 5, il set di risultati conterrà 7 righe.

Il lavoro di WITH TIES consiste nell'includere tutti i peer dell'ultima riga tra i primi n come definito dal ORDER BY clausola. rank() dà lo stesso identico risultato.

Per essere sicuro, ho testato con SQL Server, ecco una demo dal vivo.
Ed ecco un SQLfiddle più conveniente.