PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Äquivalent für TOP n WITH TIES:LIMIT with ties?

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.