PostgreSQL-Äquivalent für TOP n WITH TIES:LIMIT „mit Krawatten“?
-
09-12-2019 - |
Frage
Ich suche etwas Ähnliches in SQL Server:
SELECT TOP n WITH TIES FROM tablename
ich weiss Bescheid LIMIT
in PostgreSQL, aber gibt es das Äquivalent des oben Gesagten?Ich bin nur neugierig, da es mir jedes Mal eine zusätzliche Abfrage ersparen würde.
Wenn ich einen Tisch habe Numbers
mit Attribut nums
: {10, 9, 8, 8, 2}
.Ich möchte etwas tun wie:
SELECT nums FROM Numbers ORDER BY nums DESC LIMIT *with ties* 3
Es sollte zurückkehren {10, 9, 8, 8}
weil es die Top 3 plus das Extra braucht 8
da es den anderen bindet.
Lösung
Es gibt kein WITH TIES
Klausel in PostgreSQL als wäre da drin SQL Server.
In PostgreSQL würde ich dies ersetzen 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;
Deutlich sein, rank()
ist richtig, dense_rank()
wäre falsch (zu viele Zeilen zurückgeben).
Betrachten Sie dieses Zitat aus den SQL Server-Dokumenten (aus dem Link oben):
Wenn beispielsweise der Ausdruck auf 5 eingestellt ist, 2 zusätzliche Zeilen jedoch mit den Werten der Reihenfolge nach Spalten in Zeile 5 übereinstimmen, enthält der Ergebnissatz 7 Zeilen.
Die Aufgabe von WITH TIES
besteht darin, alle Peers der letzten Zeile oben einzubeziehen N wie durch die definiert ORDER BY
Klausel. rank()
liefert genau das gleiche Ergebnis.
Um sicherzugehen, habe ich es mit SQL Server getestet, hier ist ein Live-Demo.
Und hier ist es noch bequemer SQLfiddle.
Andere Tipps
Versuche dies:
Ausgabe:10, 9, 8, 8
with numbers (nums) as (
values (10), (9), (8), (8), (2)
)
SELECT nums FROM Numbers
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC
Ausgabe:10,10,9,8,8
with numbers (nums) as (
values (10), (9), (8), (8), (2), (10)
)
SELECT nums FROM Numbers
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC