Ich muss eine SQL-Datenbank abfragen, um alle unterschiedlichen Werte einer Spalte zu finden, und ich benötige einen beliebigen Wert aus einer anderen Spalte. Betrachten Sie beispielsweise die folgende Tabelle mit zwei Spalten, Schlüssel und Wert:
key value
=== =====
one test
one another
one value
two goes
two here
two also
three example
Ich möchte eine willkürlich ausgewählte Beispielzeile von jedem einzelnen Schlüssel zurückbekommen und vielleicht diese drei Zeilen erhalten:
key value
=== =====
one test
two goes
three example
Wie kann ich eine solche Abfrage in SQL formulieren?
Antworten:
Die einfachste Abfrage zum Schreiben ist für MySQL (mit nicht strengen ANSI-Einstellungen). Es wird die nicht standardmäßige Konstruktion verwendet:
In den letzten Versionen (5.7 und 8.0+), in denen die strengen Einstellungen und
ONLY_FULL_GROUP_BY
die Standardeinstellungen verwendet werden, können Sie dieANY_VALUE()
in 5.7 hinzugefügte Funktion verwenden:Für andere DBMS mit Fensterfunktionen (wie Postgres, SQL-Server, Oracle, DB2) können Sie diese wie folgt verwenden. Der Vorteil ist, dass Sie auch andere Spalten im Ergebnis auswählen können (neben dem
key
undvalue
):Für ältere Versionen der oben genannten und für alle anderen DBMS, eine allgemeine Methode, die fast überall funktioniert. Ein Nachteil ist, dass Sie mit diesem Ansatz keine anderen Spalten auswählen können. Ein weiterer Grund ist, dass Aggregatfunktionen in einigen DBMS (wie Bit, Text, Blobs) mit einigen Datentypen vergleichbar sind
MIN()
und mitMAX()
diesen nicht funktionieren:PostgreSQL verfügt über einen speziellen Nicht-Standard-
DISTINCT ON
Operator, der ebenfalls verwendet werden kann. Optional können SieORDER BY
auswählen, welche Zeile aus jeder Gruppe ausgewählt werden soll:quelle
ORDER BY whatever
die Abfrage in ypercube durch einen Aufruf einer Funktion, um die Ergebnisse zufällig zu sortieren.Für MS-SQL Server:
Ebenso könnten Sie rownum = 2 für Ihre zweite Ergebnismenge haben
quelle
Ähnlich der akzeptierten Antwort, aber anstelle von min () oder max () können Sie auch array_agg () verwenden.
Sie können optional Werte innerhalb des Arrays bestellen, um den größten oder kleinsten Wert auszuwählen:
(geprüft auf PostgreSQL)
quelle