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

PostgreSQL 13:BEGRENZUNG … MIT BINDUNGEN

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!