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.