Nombre distinct de valeurs de champ PostgreSQL

Joy Idialu 18 aout 2022
  1. Obtenir le nombre distinct de valeurs de champ dans PostgreSQL
  2. Obtenir le nombre distinct de valeurs de champ en fonction d’un autre champ dans PostgreSQL
Nombre distinct de valeurs de champ PostgreSQL

Obtenir les valeurs distinctes d’un champ est une requête importante à connaître. Ce didacticiel explique comment obtenir le nombre distinct de valeurs dans un champ.

Obtenir le nombre distinct de valeurs de champ dans PostgreSQL

Considérons une table quiz_score qui garde une trace du score de chaque participant à un jeu-questionnaire.

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

Voici l’instruction CREATE pour la table :

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)
);

Et voici l’instruction INSERT pour remplir le tableau avec les données :

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

Nous avons inséré dix millions de scores aléatoires dans notre tableau. Découvrons combien de scores distincts il y a dans notre table en exécutant cette requête :

SELECT COUNT(DISTINCT score) FROM quiz_score;

Cette requête a pris 3 secondes et 391 millisecondes avec un décompte de 101 valeurs distinctes.

Nous pouvons également exécuter cette autre requête pour trouver le nombre de scores distincts dans le tableau :

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

Cette nouvelle requête a pris 1 seconde et 572 millisecondes avec un décompte de 101 valeurs distinctes.

Comme nous pouvons le voir, la deuxième requête était plus rapide. L’une ou l’autre requête fonctionne correctement, mais la deuxième requête était plus rapide dans ce cas.

Obtenir le nombre distinct de valeurs de champ en fonction d’un autre champ dans PostgreSQL

Nous allons maintenant introduire une nouvelle colonne intitulée Expertise. Ce champ est rempli en fonction du score du joueur.

Les valeurs Expertise sont : Beginner, Intermediary, Expert et Master. L’expertise d’un joueur est déterminée par le score d’un joueur, comme indiqué ici :

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

La table quiz_score nouvellement mise à jour est :

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

Voici l’instruction ALTER TABLE pour ajouter la nouvelle colonne à la table :

ALTER TABLE quiz_score ADD COLUMN expertise text;

Et voici la mention UPDATE pour remplir le champ d’expertise :

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);

Dans l’exemple précédent, nous avons examiné des scores distincts dans le tableau. Dans cet exemple, découvrons combien de scores distincts il y a pour chaque expertise dans notre tableau en exécutant cette requête :

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

Voici le résultat :

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

A partir de cette requête, nous pouvons dire que l’expertise Beginner a 51 scores distincts, Intermediary a 10 scores distincts, Expert a 30 scores distincts et Master a 10 scores distincts. La requête a duré 14 secondes et 515 millisecondes.

Nous pouvons également exécuter cette autre requête pour trouver le nombre de scores distincts dans le tableau :

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

Cette nouvelle requête a pris 12 secondes et 165 millisecondes. Dans le deuxième exemple, la deuxième requête était plus rapide, mais l’une ou l’autre requête fonctionne correctement.

Dans ce didacticiel, nous avons expliqué comment obtenir des valeurs distinctes dans un champ et comment obtenir des valeurs distinctes dans un champ en fonction des valeurs distinctes d’un autre champ.