Eines der neuen Features in PostgreSQL 13 ist der SQL-Standard WITH TIES
Klausel zur Verwendung mit LIMIT
– oder, wie der Standard das nennt, FETCH FIRST n ROWS
. Dank gebührt Surafel Temesgen als Autor des ersten Patches; Tomas Vondra und mit freundlichen Grüßen für einige zusätzliche Codekorrekturen; und Rezensenten Andrew Gierth und Erik Rijkers. Sie können die Commit-Nachricht lesen.
Unentschieden treten sehr häufig auf, wenn Dinge bewertet werden; Bei einem Caucus-Rennen könnten Sie beispielsweise viele Gleichstände haben, und Sie möchten den Teilnehmern sicher nicht ihre Preise vorenthalten! Was WITH TIES
tut, ist ziemlich einfach:Es fügt Ihrer Ergebnismenge alle folgenden Zeilen oder Zeilen hinzu, wenn sie den gleichen Rang haben wie die letzte Zeile, die gemäß LIMIT
zurückgegeben wird -Klausel gemäß ORDER BY
Klausel.
Wenn Sie nur die beiden Mitarbeiter mit dem höchsten Gehalt haben möchten, können Sie Folgendes tun:
SELECT * FROM employees ORDER BY salary DESC LIMIT 2;
name | Gehalt | Abteilung |
---|---|---|
Alicia | 1600 | Engineering |
Oruga | 1500 | Marketing |
Es juckt Sie also, das Gehalt der nächsten Person zu erfahren? Was ist, wenn sie zu Oruga passt und nur durch Zufall oder Pech ausgelassen wurde? Das kann passieren, wie Sie wissen; und zum Glück WITH TIES
ist jetzt da, um den Tag zu retten. (Beachten Sie, dass wir in Wirklichkeit nicht mit WITH TIES
umgehen im LIMIT
Klausel als solche. Sie müssen den FETCH FIRST
verwenden Syntax, die von den Standards vorgeschrieben ist, um WITH TIES
verwenden zu können .)
SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 2 ROWS WITH TIES;
name | Gehalt | Abteilung |
---|---|---|
Alicia | 1600 | Engineering |
Oruga | 1500 | Verkäufe |
Conejo Blanco | 1500 | Marketing |
Dort! Weißes Kaninchen hatte aufgelistet werden, und jetzt ist er es.
Ein paar Anmerkungen, bevor Sie zu verrückt werden. LIMIT
(oder genauer FETCH FIRST
) verspricht nicht mehr, genau die Anzahl der Zeilen zurückzugeben, die Sie angeben. Sie könnten zwei oder zwanzig zusätzliche Zeilen oder 100-mal so viele Zeilen erhalten, wie Sie angefordert haben. Das bedeutet unter anderem, dass Sie verfolgen müssen, wie viele Zeilen Sie bisher gesehen haben, wenn Sie Ergebnisse paginieren. Oben hast du drei Zeilen, also überspringst du für die nächste Seite so viele, indem du den richtigen OFFSET
hinzufügst Klausel:
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3;
name | Gehalt | Abteilung |
---|---|---|
Falsa-Tortuga | 1400 | Marketing |
Duquesa | 1300 | Verkäufe |
Liebre de Marzo | 1300 | Engineering |
Wir bekamen wieder drei statt nur zwei, um die wir gebeten hatten. Für die nächste Seite müssten Sie also sechs überspringen. Und so weiter. Stellen Sie sicher, dass Sie genügend Fingerhüte für alle haben.
Die andere Sache, die Sie beachten sollten, ist, dass Sie sicherstellen müssen, dass Sie nur den ORDER BY
verwenden Klausel, die zu WITH TIES
passt Klausel; Wenn Sie beispielsweise die Zeilen mit demselben Gehalt nach Namen geordnet haben möchten, müssen Sie eine Unterabfrage verwenden. Andernfalls würde die Namensunterscheidung die Gehaltsgleichheit lösen, sodass die nächste Zeile nicht enthalten wäre. Zum Beispiel:
SELECT * FROM (
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES) AS subq
ORDER BY salary DESC, name;
Diese Funktion soll Ihnen helfen, alle Zeilen anzuzeigen, die den gleichen Wert haben – sie lässt Sie einige Zeilen mit gleichem Wert nicht allein aufgrund der physischen Position innerhalb der Tabelle diskriminieren.
Viel Spaß beim Paginieren!