Articles

Como seleccionar valores distintos dos resultados da consulta no PostgreSQL

SUMMARY: Este artigo revê métodos para seleccionar valores distintos dos resultados da consulta no PostgreSQL. As palavras-chave e cláusulas discutidas com exemplos incluem:

1. DISTINCT

2. DISTINCT ON

3. GROUP BY

4. HAVING

5. Algumas advertências

Neste post, vamos ver como seleccionar valores distintos de consultas/estabelecimentos SQL. Uma das formas mais fáceis de seleccionar valores distintos é utilizando a palavra-chave DISTINCT. Vamos explorar primeiro esta palavra-chave.

DISTINCT

DISTINCT é utilizada para remover linhas duplicadas da consulta SELECT e exibir apenas uma única linha do conjunto de resultados.

Exemplos

DISTRINTETO é usado para remover linhas duplicadas da consulta SELECT e exibir apenas uma única linha do conjunto de resultados:

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

Criar uma tabela, “teste”:

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

–Inserir alguns registos na tabela “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');

Utilizar a consulta SELECT para ver as linhas da tabela “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)

Agora que a tabela foi configurada, vejamos algumas formas que a DISTINCT pode classificar através dos dados:

1. Pode usar SELECT com DISTINCT para encontrar apenas os valores não duplicados da coluna “col1”:

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

2. SELECT com DISTINCT também pode ser usado numa consulta SQL inline:

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

3. DISTINCT também pode ser usado com COUNT e outros agregados:

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

4. Pode usar SELECT com DISTINCT em duas colunas da tabela:

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

5. Também pode utilizar SELECT com DISTINCT em todas as colunas da tabela:

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)

Notifique aqui que todas as linhas foram exibidas, duplicatas incluídas, pois não existem linhas distintas na coluna “col3”.

Uma variante do DISTINCT é DISTINCT ON. agora Vamos explorar isto.

DISTINCT ON

Quando distintas não podem retornar filas únicas quando todas as combinações de colunas não são únicas, então podemos usar cláusulas distintas que darão a primeira fila a partir desse conjunto de filas duplicadas.A coluna que estamos a especificar em DISTINCT ON <col_name> também deve estar presente na cláusula ORDER BY; caso contrário, receberá um erro.

Exemplo

P>Pode usar DISTINCT ON para mostrar o primeiro de cada valor em “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)

Cavernas

Existem alguns cenários em que a palavra-chave distinta não pode ser usada.

1. DISTINCT é uma palavra-chave reservada no PostgreSQL, pelo que não a podemos especificar como um nome de objecto.

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

2. Numa consulta SELECT não podemos ter mais do que uma palavra-chave DISTINCT:

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

3. Também não podemos utilizá-la em WHERE e GROUP BY conditions:

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

ou

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 não podem ser especificados com DISTINCT:

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

Outra forma popular de seleccionar valores não duplicados é utilizando a cláusula GROUP BY com HAVING.

GROUP BY e HAVING

Com GROUP BY e HAVING, é possível seleccionar valores distintos com base em grupo de colunas. Onde também se pode utilizar o ter para encontrar valores duplicados.

Functionality-wise group by e trabalhos distintos de forma semelhante, mas agrupar também proporciona flexibilidade para utilizar funções agregadas juntamente com a obtenção de dados únicos. O desempenho – também agrupar por é melhor do que distinguir.

Exemplos

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)

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *