Recuento distinto de valores de campo de PostgreSQL

Joy Idialu 30 enero 2023
  1. Obtenga el recuento distintivo de valores de campo en PostgreSQL
  2. Obtenga el recuento distinto de valores de campo en función de otro campo en PostgreSQL
Recuento distinto de valores de campo de PostgreSQL

Obtener los valores distintos en un campo es una consulta importante que debe saber. Este tutorial explica cómo obtener el recuento distinto de valores en un campo.

Obtenga el recuento distintivo de valores de campo en PostgreSQL

Considere una tabla quiz_score que realiza un seguimiento de la puntuación de cada participante en un juego de preguntas.

id player_id score
1 1 10
2 2 10
3 3 18
4 4 69
5 5 24
6 6 67
7 7 94
8 8 68
9 9 33
10 10 5

Aquí está la instrucción CREATE para la tabla:

CREATE TABLE quiz_score
(
    id integer NOT NULL GENERATED ALWAYS AS IDENTITY,
    player_id integer NOT NULL,
    score integer NOT NULL,
    CONSTRAINT quiz_score_pkey PRIMARY KEY (id)
);

Y aquí está la instrucción INSERT para llenar la tabla con los datos:

INSERT INTO quiz_score (player_id, score)
SELECT i, floor(random()*(100-0+1))
FROM generate_series(1,10000000) i;

Hemos insertado diez millones de puntajes aleatorios en nuestra tabla. Averigüemos cuántos puntajes distintos hay en nuestra tabla ejecutando esta consulta:

SELECT COUNT(DISTINCT score) FROM quiz_score;

Esta consulta tardó 3 segundos y 391 milisegundos con un recuento de 101 valores distintos.

También podemos ejecutar esta otra consulta para encontrar el número de puntuaciones distintas en la tabla:

SELECT COUNT(*) FROM (SELECT DISTINCT score FROM quiz_score) AS DistinctScores;

Esta nueva consulta tardó 1 segundo y 572 milisegundos con un recuento de 101 valores distintos.

Como podemos ver, la segunda consulta fue más rápida. Cualquier consulta funciona bien, pero la segunda consulta fue más rápida en este caso.

Obtenga el recuento distinto de valores de campo en función de otro campo en PostgreSQL

Ahora presentaremos una nueva columna llamada Expertise. Este campo se rellena en función de la puntuación del jugador.

Los valores de Expertise son: Beginner, Intermediary, Expert y Master. La experiencia de un jugador está determinada por la puntuación de un jugador, como se muestra aquí:

Expertise score
Beginner 0 - 50
Intermediary 51 - 80
Expert 81 - 90
Master 91 - 100

La tabla quiz_score recientemente actualizada es:

id player_id score player_rank
1 1 10 Beginner
2 2 10 Beginner
3 3 18 Beginner
4 4 69 Intermediary
5 5 24 Beginner
6 6 67 Intermediary
7 7 94 Master
8 8 68 Intermediary
9 9 33 Beginner
34 34 89 Expert

Aquí está la instrucción ALTER TABLE para agregar la nueva columna a la tabla:

ALTER TABLE quiz_score ADD COLUMN expertise text;

Y aquí está la declaración UPDATE para completar el campo de experiencia:

UPDATE quiz_score
SET expertise =
(CASE
    WHEN score >= 0
        AND score <= 50 THEN 'Beginner'
    WHEN score > 50
        AND score <= 80 THEN 'Intermediary'
    WHEN score > 80
        AND score <= 90 THEN 'Expert'
    WHEN score > 90 THEN 'Master'
END);

En el ejemplo anterior, observamos distintos puntajes en la tabla. En este ejemplo, averigüemos cuántos puntajes distintos hay para cada experiencia en nuestra tabla ejecutando esta consulta:

SELECT expertise, COUNT(DISTINCT score)
FROM quiz_score
GROUP BY expertise

Aquí está el resultado:

  expertise   | count
--------------+-------
 Beginner     |    51
 Intermediary |    10
 Expert       |    30
 Master       |    10

A partir de esta consulta, podemos decir que la experiencia Beginner tiene 51 puntuaciones distintas, Intermediary tiene 10 puntuaciones distintas, Expert tiene 30 puntuaciones distintas y Master tiene 10 puntuaciones distintas. La consulta tomó 14 segundos y 515 milisegundos.

También podemos ejecutar esta otra consulta para encontrar el número de puntuaciones distintas en la tabla:

SELECT
    DISTINCT ON (expertise) expertise,
    COUNT(DISTINCT score)
FROM
    quiz_score
GROUP BY expertise

Esta nueva consulta tomó 12 segundos y 165 milisegundos. En el segundo ejemplo, la segunda consulta fue más rápida, pero cualquiera de las consultas funciona bien.

En este tutorial, hemos discutido cómo obtener valores distintos en un campo y cómo obtener valores distintos en un campo en función de valores distintos de otro campo.