Articles

Cómo seleccionar valores distintos de los resultados de una consulta en PostgreSQL

SUMEN: Este artículo revisa los métodos para seleccionar valores distintos de los resultados de una consulta en PostgreSQL. Las palabras clave y las cláusulas discutidas con ejemplos incluyen:

1. DISTINTO

2. DISTINTO ON

3. GROUP BY

4. HAVING

5. Algunas advertencias

En este post, vamos a ver cómo seleccionar valores distintos desde consultas/afirmaciones SQL. Una de las formas más sencillas de seleccionar valores distintos es utilizando la palabra clave DISTINCT. Vamos a explorar esta palabra clave primero.

DISTINCT

DISTINCT se utiliza para eliminar las filas duplicadas de la consulta SELECT y sólo mostrar una fila única del conjunto de resultados.

Ejemplos

Creemos una nueva tabla en PostgreSQL y la utilizamos para ver algunas formas útiles en las que DISTINCT puede eliminar duplicados y revelar información útil de los datos.

Primero, conéctese a la terminal psql:

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

Crea una tabla, «test»:

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

-Inserta unos cuantos registros en la tabla «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');

Usa la consulta SELECT para ver las filas de la tabla «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)

Ahora que la tabla ha sido configurada, veamos algunas formas en que DISTINCT puede ordenar los datos:

1. Puede utilizar SELECT con DISTINCT para encontrar sólo los valores no duplicados de la columna «col1»:

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

2. SELECT con DISTINCT también se puede utilizar en una consulta SQL en línea:

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

3. También se puede utilizar DISTINCT con COUNT y otros agregados:

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

4. Se puede utilizar SELECT con DISTINCT en dos columnas de la tabla:

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

5. También puedes utilizar SELECT con DISTINTO en todas las columnas de la tabla:

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 que aquí se han mostrado todas las filas, duplicados incluidos, ya que no hay filas distintas en la columna «col3».

Una variante de DISTINCT es DISTINCT ON. ahora Vamos a explorar esto.

DISTINCT ON

Cuando distinct no puede devolver una fila única cuando la combinación de todas las columnas no es única, entonces podemos utilizar la cláusula distinct on que dará la primera fila de ese conjunto de filas duplicadas.La columna que estamos especificando en DISTINCT ON <col_name> también debe estar presente en la cláusula ORDER BY; de lo contrario, obtendrá un error.

Ejemplo

Puede utilizar DISTINCT ON para mostrar el primero de cada valor en «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

Hay algunos escenarios en los que no se puede utilizar la palabra clave distinct.

1. DISTINCT es una palabra clave reservada en PostgreSQL, por lo que no podemos especificarla como nombre de objeto.

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

2. En una consulta SELECT no podemos tener más de una palabra clave DISTINCT:

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

3. Tampoco podemos usarla en condiciones WHERE y 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 y FOR KEY SHARE no pueden especificarse con DISTINCT:

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

Otra forma popular de seleccionar valores no duplicados es utilizando la cláusula GROUP BY con HAVING.

GROUP BY y HAVING

Con GROUP BY y HAVING, puede seleccionar valores distintos basados en grupos de columnas. Where having puede ser utilizado para encontrar valores duplicados también.

En cuanto a la funcionalidad, group by y distinct funcionan de forma similar, pero group by también proporciona flexibilidad para utilizar funciones de agregación junto con la obtención de datos únicos. En cuanto al rendimiento, group by es mejor que distinct.

Ejemplos

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)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *