La cláusula DISTINCT en PostgreSQL

Bilal Shahid 15 febrero 2024
  1. Introducción a la Cláusula DISTINCT en PostgreSQL
  2. Uso de la Cláusula DISTINCT en PostgreSQL
  3. Uso de la Cláusula DISTINCT ON en PostgreSQL
La cláusula DISTINCT en PostgreSQL

Este tutorial ilustra el uso de la cláusula DISTINCT usando diferentes ejemplos de código. También demuestra cómo usar esta cláusula en toda la tabla y en un conjunto específico de atributos.

Introducción a la Cláusula DISTINCT en PostgreSQL

Sabemos que si queremos mostrar todas las filas de una tabla, podemos usar una simple instrucción SELECT. Así que supongamos que tenemos la siguiente tabla:

Create table sample ( Number int not null);

Ahora, insertemos algunos datos en esta tabla de muestra:

Insert into sample values (100), (200), (300), (100);

Si ahora ejecutamos una consulta simple SELECT * FROM sample en esta base de datos, obtenemos el siguiente resultado que muestra todas las filas:

cláusula distinta en postgresql - salida uno

¿Puedes ver lo que está pasando aquí? El valor 100 se imprime dos veces desde que se repitió durante la inserción. ¿Qué pasa si queremos mostrar valores únicos? ¿Hay alguna forma de hacer esto en PostgreSQL?

Sí, la cláusula DISTINCT nos permite filtrar los duplicados del resultado de una consulta y mostrarlos solo una vez. En detalle a continuación, aprendamos DISTINCT y DISTINCT ON en PostgreSQL.

Uso de la Cláusula DISTINCT en PostgreSQL

La cláusula DISTINCT en una instrucción SELECT elimina todos los valores de fila duplicados del resultado. De los valores idénticos, solo se muestra uno para que ningún valor se repita en la salida.

Examinemos la sintaxis de la cláusula DISTINCT aplicándola a la tabla muestra definida anteriormente.

SELECT DISTINCT * FROM sample;

Obtenemos el siguiente resultado al ejecutar esta consulta:

cláusula distinta en postgresql - salida dos

¿Notaste la diferencia? Ahora el valor de 100 se muestra solo una vez en lugar de dos veces en una declaración simple de SELECCIÓN. Ese es el poder de la cláusula DISTINCT.

Ahora que comprende el uso de la cláusula DISTINCT, permítanos presentarle otro escenario. Supongamos que tenemos la siguiente tabla:

Create table example(
    Id int not null,
    Number int not null,
    Constraint PK2 primary key (id)
);

Insert into example values (1, 100), (2, 200), (3, 300), (4, 100);

Si ahora ejecutamos un simple ejemplo SELECT * FROM; consulta, obtenemos el siguiente resultado que muestra todas las filas:

cláusula distinta en postgresql - salida tres

Podemos ver que el valor de 100 se repite, como era de esperar. Usemos la cláusula DISTINCT como hemos aprendido anteriormente:

SELECT DISTINCT * FROM example;

cláusula distinta en postgresql - salida tres

¡No funcionó! Todavía estamos obteniendo la misma salida. Todas las filas con un valor de 100 no se duplican cuando se tratan como un todo junto con id.

Son únicos porque el valor de id es diferente en ambos y, por lo tanto, se muestran en la salida. Entonces, ¿cómo hacemos esto?

¿Tenemos alguna forma de filtrar duplicados de atributos particulares? Sí, la cláusula DISTINCT ON nos permite hacerlo en PostgreSQL.

Uso de la Cláusula DISTINCT ON en PostgreSQL

La cláusula DISTINCT ON nos permite eliminar valores duplicados de atributos específicos del resultado de una consulta SELECT mostrando solo la primera aparición del valor.

De esta forma, incluso si los valores de los otros atributos en las filas son diferentes, solo se mostrará la primera fila detectada. Tiene la siguiente sintaxis:

DISTINCT ON (attribute1, attribute2,)

Entendamos la sintaxis y el funcionamiento de la cláusula DISTINCT ON ejecutando la siguiente consulta en la tabla de ejemplo definida anteriormente.

SELECT DISTINCT ON (number) * FROM example;

Da el siguiente resultado:

cláusula distinta en postgresql - salida cuatro

¡El valor duplicado de 100 se ha ido! Entonces podemos ver que solo la primera fila que tiene el valor repetido de número se muestra en la salida, como se esperaba. El punto crítico es que la primera fila no siempre es predecible.

Significa que la consulta puede devolver un resultado diferente cada vez que se ejecuta, lo que puede ser un problema. Por lo tanto, usarlo junto con la cláusula ORDER BY es una buena práctica.

La cláusula ORDER BY le permite ordenar los datos en función de uno o varios atributos de la tabla. Podemos ordenar en orden descendente o ascendente usando ese conjunto de atributos.

Veamos cómo se usa la cláusula ORDER BY con la cláusula DISTINCT ON usando la siguiente consulta:

SELECT DISTINCT ON (number) * FROM example
ORDER BY number, id DESC;

Ejecutar esta consulta nos da el siguiente resultado:

cláusula distinta en postgresql - salida cinco

Podemos ver que ahora la última fila se muestra como la única ocurrencia repetida.

Debido a que ordenamos las filas en orden descendente según el id, la última fila que tiene id como 4 aparece primero y se trata como la primera aparición.

Sin embargo, debe haber notado que a pesar de que queríamos ordenar las filas según id, aún especificamos número como el primer atributo en la cláusula ORDER BY.

PostgreSQL requiere que el atributo o atributos más a la izquierda especificados en la cláusula ORDER BY deben coincidir con los escritos en la cláusula DISTINCT ON. Es solo un requisito de PostgreSQL.

Si lo analizamos, podemos ver que no perturba los resultados de las filas duplicadas porque los atributos más a la izquierda tendrán los mismos valores. Por lo tanto, las filas se ordenarán automáticamente de acuerdo con los siguientes atributos.

En este caso, número tenía el valor exacto de 100, por lo que las filas se ordenaron según el siguiente atributo, es decir, id. Intentemos ejecutar la siguiente consulta, que sabemos que dará error:

SELECT DISTINCT ON (number) * FROM example
ORDER BY id DESC;

Como era de esperar, obtenemos el siguiente error:

cláusula distinta en postgresql - salida seis

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub