Articles

Jak wybrać odrębne wartości z wyników zapytania w PostgreSQL

Podsumowanie: W artykule omówiono metody wyboru odrębnych wartości z wyników zapytania w PostgreSQL. Omówione słowa kluczowe i klauzule wraz z przykładami to:

1. DISTINCT

2. DISTINCT ON

3. GROUP BY

4. HAVING

5. Kilka zastrzeżeń

W tym poście zobaczymy, jak wybrać odrębne wartości z zapytań/wypowiedzi SQL. Jednym z najprostszych sposobów na wybranie odrębnych wartości jest użycie słowa kluczowego DISTINCT. Przeanalizujmy najpierw to słowo kluczowe.

DISTINCT

DISTINCT jest używane do usuwania duplikatów wierszy z zapytania SELECT i wyświetlania tylko jednego unikalnego wiersza z zestawu wyników.

Przykłady

Załóżmy nową tabelę w PostgreSQL i użyjmy jej, aby przyjrzeć się kilku pomocnym sposobom, w jaki DISTINCT może usunąć duplikaty i ujawnić użyteczne informacje z danych.

Najpierw połącz się z terminalem psql:

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

Utwórz tabelę „test”:

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

–Wstaw kilka rekordów do tabeli „test”:

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');

Użyj zapytania SELECT, aby zobaczyć wiersze tabeli „test”:

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)

Teraz, gdy tabela została utworzona, przyjrzyjmy się kilku sposobom, na jakie DISTINCT może sortować dane:

1. Możesz użyć SELECT z DISTINCT, aby znaleźć tylko nieduplikowane wartości z kolumny „col1”:

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

2. SELECT with DISTINCT może być również użyty w zapytaniu SQL inline:

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

3. DISTINCT może być również użyty z COUNT i innymi agregatami:

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

4. Można użyć SELECT with DISTINCT na dwóch kolumnach tabeli:

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

5. Możesz również użyć SELECT z DISTINCT na wszystkich kolumnach tabeli:

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)

Zauważ tutaj, że wszystkie wiersze zostały wyświetlone, duplikaty włącznie, ponieważ nie ma żadnych odrębnych wierszy w kolumnie „col3”.

Odmianą DISTINCT jest DISTINCT ON. teraz Zbadajmy to.

DISTINCT ON

Gdy distinct nie może zwrócić unikalnego wiersza, gdy wszystkie kolumny nie są unikalne, możemy użyć klauzuli distinct on, która da nam pierwszy wiersz z zestawu zduplikowanych wierszy.Kolumna, którą określamy w klauzuli DISTINCT ON <col_name> powinna być również obecna w klauzuli ORDER BY; w przeciwnym razie pojawi się błąd.

Przykład

Możesz użyć DISTINCT ON, aby wyświetlić pierwszą z każdej wartości w „col1”:

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)

Caveats

Istnieje kilka scenariuszy, w których nie można użyć słowa kluczowego distinct.

1. DISTINCT jest zastrzeżonym słowem kluczowym w PostgreSQL, więc nie możemy go określić jako nazwy obiektu.

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

2. W zapytaniu SELECT nie możemy użyć więcej niż jednego słowa kluczowego DISTINCT:

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

3. Nie możemy go również użyć w warunkach WHERE oraz GROUP BY:

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

lub

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

4. FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE i FOR KEY SHARE nie mogą być określone za pomocą DISTINCT:

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

Innym popularnym sposobem wyboru nieduplikowanych wartości jest użycie klauzuli GROUP BY with HAVING.

GROUP BY i HAVING

Z GROUP BY i HAVING, możesz wybrać odrębne wartości w oparciu o grupę kolumn. Where having może być również użyte do znalezienia zduplikowanych wartości.

Funkcjonalnie group by i distinct działają podobnie, ale group by zapewnia również elastyczność w użyciu funkcji agregujących wraz z uzyskaniem unikalnych danych. Również pod względem wydajności group by jest lepsze niż distinct.

Przykłady

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)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *