Postgres 13 schließlich fügt WITH TIES
hinzu . Siehe:
- Größer als oder gleich ALL() und gleich MAX() Geschwindigkeit
Es gibt kein WITH TIES
-Klausel bis zu PostgreSQL 12, wie es sie in SQL Server gibt.
In PostgreSQL würde ich diese durch TOP n WITH TIES .. ORDER BY <something>
ersetzen :
WITH cte AS (
SELECT *, rank() OVER (ORDER BY <something>) AS rnk
FROM tbl
)
SELECT *
FROM cte
WHERE rnk <= n;
Um es klar zu sagen, rank()
stimmt, dense_rank()
wäre falsch (gibt zu viele Zeilen zurück).
Betrachten Sie dieses Zitat aus der SQL Server-Dokumentation (vom Link oben):
Wenn beispielsweise expression auf 5 gesetzt ist, aber 2 zusätzliche Zeilen mit den Werten der ORDER BY-Spalten in Zeile 5 übereinstimmen, enthält die Ergebnismenge 7 Zeilen.
Der Job von WITH TIES
soll alle Peers der letzten Zeile in den obersten n enthalten wie durch ORDER BY
definiert Klausel. rank()
ergibt genau das gleiche Ergebnis.
Um sicherzugehen, habe ich es mit SQL Server getestet, hier ist eine Live-Demo.
Und hier ist eine bequemere SQLfiddle.