Postgres 13 lägger äntligen till WITH TIES
. Se:
- Större än eller lika med ALL() och lika med MAX() hastighet
Det finns ingen WITH TIES
klausul upp till PostgreSQL 12, som det finns i SQL Server.
I PostgreSQL skulle jag ersätta denna med 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;
För att vara tydlig, rank()
är rätt, dense_rank()
skulle vara fel (returnera för många rader).
Tänk på detta citat från SQL Server-dokumenten (från länken ovan):
Till exempel, om uttrycket är inställt på 5 men ytterligare 2 rader matchar värdena i ORDER BY-kolumnerna på rad 5, kommer resultatuppsättningen att innehålla 7 rader.
Jobbet som WITH TIES
är att inkludera alla peers på den sista raden i den översta n enligt definitionen av ORDER BY
klausul. rank()
ger exakt samma resultat.
För att vara säker, testade jag med SQL-server, här är en livedemo.
Och här är en mer bekväm SQL-fiddle.