Articles

Come selezionare valori distinti dai risultati delle query in PostgreSQL

SUMMARIO: Questo articolo esamina i metodi per selezionare valori distinti dai risultati delle query in PostgreSQL. Le parole chiave e le clausole discusse con esempi includono:

1. DISTINCT

2. DISTINCT ON

3. GROUP BY

4. HAVING

5. Alcune avvertenze

In questo post, vedremo come selezionare i valori distinti dalle query SQL. Uno dei modi più semplici per selezionare valori distinti è usare la parola chiave DISTINCT. Esploriamo prima questa parola chiave.

DISTINCT

DISTINCT è usato per rimuovere le righe duplicate dalla query SELECT e visualizzare solo una riga unica dal set di risultati.

Esempi

Impostiamo una nuova tabella in PostgreSQL e usiamola per vedere alcuni modi utili in cui DISTINCT può rimuovere i duplicati e rivelare informazioni utili dai dati:

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

Crea una tabella, “test”:

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

–Inserire alcuni record nella tabella “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');

Utilizzare la query SELECT per vedere le righe della tabella “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)

Ora che la tabella è stata impostata, vediamo alcuni modi in cui DISTINCT può ordinare i dati:

1. Si può usare SELECT con DISTINCT per trovare solo i valori non duplicati della colonna “col1”:

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

2. SELECT con DISTINCT può anche essere usato in una query SQL in linea:

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

3. DISTINCT può anche essere usato con COUNT e altri aggregati:

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

4. Si può usare SELECT con DISTINCT su due colonne della tabella:

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

5. Si può anche usare SELECT con DISTINCT su tutte le colonne della tabella:

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)

Nota qui che tutte le righe sono state visualizzate, duplicati inclusi, poiché non ci sono righe distinte nella colonna “col3”.

Una variante di DISTINCT è DISTINCT ON.

DISTINCT ON

Quando distinct non può restituire una riga unica quando tutte le combinazioni di colonne non sono uniche, allora possiamo usare la clausola distinct on che darà la prima riga da quell’insieme di righe duplicate.La colonna che stiamo specificando in DISTINCT ON <col_name> dovrebbe essere presente anche nella clausola ORDER BY; altrimenti si otterrà un errore.

Esempio

Puoi usare DISTINCT ON per visualizzare il primo di ogni valore in “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)

Cavezzoli

Ci sono alcuni scenari dove la parola chiave distinct non può essere usata.

1. DISTINCT è una parola chiave riservata in PostgreSQL, quindi non possiamo specificarla come nome di un oggetto.

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

2. In una query SELECT non possiamo avere più di una parola chiave DISTINCT:

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

3. Non possiamo anche usarla nelle condizioni WHERE e GROUP BY:

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

o

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 e FOR KEY SHARE non possono essere specificati con DISTINCT:

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

Un altro modo popolare per selezionare valori non duplicati è usare la clausola GROUP BY con HAVING.

GROUP BY e HAVING

Con GROUP BY e HAVING, è possibile selezionare valori distinti basati su gruppi di colonne. Dove avere può essere usato anche per trovare valori duplicati.

Funzionalità: group by e distinct funzionano in modo simile, ma group by fornisce anche la flessibilità di usare funzioni aggregate e di ottenere dati unici. Anche dal punto di vista delle prestazioni group by è migliore di distinct.

Esempi

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)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *