Postgres 13 tilføjer endelig WITH TIES
. Se:
- Større end eller lig med ALL() og lig med MAX() hastighed
Der er ingen WITH TIES
klausul op til PostgreSQL 12, som der er i SQL Server.
I PostgreSQL ville jeg erstatte denne med TOP n MED BINDELSER .. BESTIL EFTER
WITH cte AS (
SELECT *, rank() OVER (ORDER BY <something>) AS rnk
FROM tbl
)
SELECT *
FROM cte
WHERE rnk <= n;
For at være tydelig, rank()
er rigtigt, dense_rank()
ville være forkert (returnerer for mange rækker).
Overvej dette citat fra SQL Server-dokumenterne (fra linket ovenfor):
For eksempel, hvis udtryk er sat til 5, men 2 yderligere rækker matcher værdierne af ORDER BY kolonnerne i række 5, vil resultatsættet indeholde 7 rækker.
Jobbet som WITH TIES
er at inkludere alle peers i den sidste række i den øverste n som defineret af ORDER BY
klausul. rang()
giver nøjagtig samme resultat.
For at være sikker, testede jeg med SQL-server, her er en live-demo.
Og her er en mere praktisk SQLfiddle.