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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top