Nombre distinct de valeurs de champ PostgreSQL
- Obtenir le nombre distinct de valeurs de champ dans PostgreSQL
- Obtenir le nombre distinct de valeurs de champ en fonction d’un autre champ dans 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.