Articles

Wie man eindeutige Werte aus Abfrageergebnissen in PostgreSQL auswählt

Zusammenfassung: In diesem Artikel werden Methoden zur Auswahl eindeutiger Werte aus Abfrageergebnissen in PostgreSQL besprochen. Zu den besprochenen Schlüsselwörtern und Klauseln mit Beispielen gehören:

1. DISTINCT

2. DISTINCT ON

3. GROUP BY

4. HAVING

5. Einige Vorbehalte

In diesem Beitrag werden wir sehen, wie man eindeutige Werte aus SQL-Abfragen/Anweisungen auswählen kann. Eine der einfachsten Möglichkeiten, eindeutige Werte auszuwählen, ist die Verwendung des Schlüsselworts DISTINCT. Lassen Sie uns dieses Schlüsselwort zuerst untersuchen.

DISTINCT

DISTINCT wird verwendet, um doppelte Zeilen aus der SELECT-Abfrage zu entfernen und nur eine eindeutige Zeile aus der Ergebnismenge anzuzeigen.

Beispiele

Lassen Sie uns eine neue Tabelle in PostgreSQL einrichten und damit ein paar hilfreiche Möglichkeiten betrachten, wie DISTINCT Duplikate entfernen und nützliche Informationen aus den Daten aufdecken kann.

Zunächst verbinden Sie sich mit dem Terminal psql:

/usr/pgsql-11/bin/psql -U postgres postgres

Erstellen Sie eine Tabelle, „test“:

create table test(col1 int, col2 varchar,col3 date);

-Ein paar Datensätze in die Tabelle „test“ einfügen:

insert into test values (1,'abc','2015-09-10');insert into test values (1,'abc','2015-09-11');insert into test values (2,'xyz','2015-09-12');insert into test values (2,'xyz','2015-09-13');insert into test values (3,'tcs','2015-01-15');insert into test values (3,'tcs','2015-01-18');

Mit der SELECT-Abfrage können Sie die Zeilen der Tabelle „test“ einsehen:

postgres=# select * from test; col1 | col2 | col3 ------+------+------------ 1 | abc | 2015-09-10 1 | abc | 2015-09-11 2 | xyz | 2015-09-12 2 | xyz | 2015-09-13 3 | tcs | 2015-01-15 3 | tcs | 2015-01-18(6 rows)

Nun, da die Tabelle eingerichtet ist, lassen Sie uns ein paar Möglichkeiten betrachten, wie DISTINCT die Daten sortieren kann:

1. Sie können SELECT mit DISTINCT verwenden, um nur die nicht-duplizierten Werte aus Spalte „col1“ zu finden:

postgres=# select distinct(col1) from test order by col1; col1 ------ 1 2 3(3 rows)

2. SELECT mit DISTINCT kann auch in einer SQL-Inline-Abfrage verwendet werden:

postgres=# select col1 from (select distinct(col1) from test order by col1) as foo; col1 ------ 1 2 3(3 rows)

3. DISTINCT kann auch mit COUNT und anderen Aggregaten verwendet werden:

postgres=# select col1,count(distinct(col1)) from test group by col1; col1 | count ------+------- 1 | 1 2 | 1 3 | 1(3 rows)

4. Sie können SELECT mit DISTINCT auf zwei Spalten der Tabelle anwenden:

postgres=# select distinct col1,col2 from test order by 1; col1 | col2 ------+------ 1 | abc 2 | xyz 3 | tcs(3 rows)

5. Sie können SELECT mit DISTINCT auch auf alle Spalten der Tabelle anwenden:

postgres=# select distinct col1,col2,col3 from test order by 1; col1 | col2 | col3 ------+------+------------ 1 | abc | 2015-09-11 1 | abc | 2015-09-10 2 | xyz | 2015-09-13 2 | xyz | 2015-09-12 3 | tcs | 2015-01-15 3 | tcs | 2015-01-18(6 rows)

Beachten Sie hier, dass alle Zeilen angezeigt werden, einschließlich der Duplikate, da es keine eindeutigen Zeilen in der Spalte „col3“ gibt.

Eine Variante von DISTINCT ist DISTINCT ON. Das wollen wir nun untersuchen.

DISTINCT ON

Wenn distinct keine eindeutige Zeile zurückgeben kann, wenn alle Spaltenkombinationen nicht eindeutig sind, können wir die distinct on-Klausel verwenden, die die erste Zeile aus der Menge der doppelten Zeilen liefert.Die Spalte, die wir in DISTINCT ON <col_name> angeben, sollte auch in der ORDER BY-Klausel vorhanden sein, sonst erhalten Sie einen Fehler.

Beispiel

Sie können DISTINCT ON verwenden, um den jeweils ersten Wert in „col1“ anzuzeigen:

postgres=# select distinct on (col1) col1,col2,col3 from test order by col1; col1 | col2 | col3 ------+------+------------ 1 | abc | 2015-09-10 2 | xyz | 2015-09-13 3 | tcs | 2015-01-15(3 rows)

Reserviert

Es gibt ein paar Szenarien, in denen das Schlüsselwort distinct nicht verwendet werden kann.

1. DISTINCT ist ein reserviertes Schlüsselwort in PostgreSQL, daher können wir es nicht als Objektname angeben.

postgres=# create table distinct(n int);ERROR: syntax error at or near "distinct"

2. In einer SELECT-Abfrage können wir nicht mehr als ein DISTINCT-Schlüsselwort haben:

postgres=# select distinct 1, distinct 2;ERROR: syntax error at or near "distinct"

3. Wir können es auch nicht in WHERE- und GROUP BY-Bedingungen verwenden:

postgres=# select * from test where distinct(col1)=1;ERROR: syntax error at or near "distinct"

oder

postgres=# select distinct(col1) from test group by distinct(col1);ERROR: syntax error at or near "distinct"

4. FOR KEY UPDATE, FOR UPDATE, FOR SHARE und FOR KEY SHARE können nicht mit DISTINCT angegeben werden:

postgres=# select distinct(col1),col2,col3 from test order by 1 for update;ERROR: FOR UPDATE is not allowed with DISTINCT clause

Eine weitere beliebte Möglichkeit, nicht-duplizierende Werte auszuwählen, ist die Verwendung der GROUP BY mit HAVING-Klausel.

GROUP BY und HAVING

Mit GROUP BY und HAVING können Sie unterschiedliche Werte basierend auf einer Gruppe von Spalten auswählen. Wobei HAVING auch verwendet werden kann, um doppelte Werte zu finden.

Funktional gesehen funktionieren group by und distinct ähnlich, aber group by bietet auch die Flexibilität, Aggregatfunktionen zu verwenden und eindeutige Daten zu erhalten. Auch von der Leistung her ist group by besser als distinct.

Beispiele

postgres=# select col1, col2 from test group by col1,col2 order by 1; col1 | col2 ------+------ 1 | abc 2 | xyz 3 | tcs(3 rows) postgres=# select col1, col2,count(*) from test group by col1,col2 order by 1; col1 | col2 | count ------+------+------- 1 | abc | 2 2 | xyz | 2 3 | tcs | 2(3 rows)postgres=# select col1 from test group by col1 having count(col1) > 1 order by 1; col1 ------ 1 2 3(3 rows)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.