PostgreSQL Distinct Count von Feldwerten

Joy Idialu 18 August 2022
  1. Ermitteln der eindeutigen Anzahl von Feldwerten in PostgreSQL
  2. Ermitteln der Anzahl eindeutiger Feldwerte auf der Grundlage eines anderen Feldes in PostgreSQL
PostgreSQL Distinct Count von Feldwerten

Das Abrufen der unterschiedlichen Werte in einem Feld ist eine wichtige Abfrage, die Sie kennen sollten. In diesem Tutorial wird erläutert, wie Sie die eindeutige Anzahl von Werten in einem Feld abrufen.

Ermitteln der eindeutigen Anzahl von Feldwerten in PostgreSQL

Stellen Sie sich eine quiz_score-Tabelle vor, die die Punktzahl jedes Teilnehmers in einem Quizspiel verfolgt.

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

Hier ist die CREATE-Anweisung für die Tabelle:

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

Und hier ist die INSERT-Anweisung, um die Tabelle mit den Daten zu füllen:

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

Wir haben zehn Millionen Zufallsergebnisse in unsere Tabelle eingefügt. Lassen Sie uns herausfinden, wie viele verschiedene Punktzahlen es in unserer Tabelle gibt, indem Sie diese Abfrage ausführen:

SELECT COUNT(DISTINCT score) FROM quiz_score;

Diese Abfrage dauerte 3 Sekunden und 391 Millisekunden mit einer Anzahl von 101 unterschiedlichen Werten.

Wir können auch diese andere Abfrage ausführen, um die Anzahl der unterschiedlichen Bewertungen in der Tabelle zu ermitteln:

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

Diese neue Abfrage dauerte 1 Sekunde und 572 Millisekunden mit einer Anzahl von 101 unterschiedlichen Werten.

Wie wir sehen können, war die zweite Abfrage schneller. Beide Abfragen funktionieren gut, aber die zweite Abfrage war in diesem Fall schneller.

Ermitteln der Anzahl eindeutiger Feldwerte auf der Grundlage eines anderen Feldes in PostgreSQL

Wir werden nun eine neue Rubrik namens Expertise einführen. Dieses Feld wird basierend auf der Punktzahl des Spielers ausgefüllt.

Die Expertise-Werte sind: Beginner, Intermediary, Expert und Master. Die Expertise eines Spielers wird durch die Punktzahl eines Spielers bestimmt, wie hier gezeigt:

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

Die neu aktualisierte quiz_score-Tabelle lautet:

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

Hier ist die Anweisung ALTER TABLE, um die neue Spalte zur Tabelle hinzuzufügen:

ALTER TABLE quiz_score ADD COLUMN expertise text;

Und hier ist die UPDATE-Anweisung, um das Expertise-Feld zu füllen:

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

Im vorherigen Beispiel haben wir uns unterschiedliche Bewertungen in der Tabelle angesehen. Lassen Sie uns in diesem Beispiel herausfinden, wie viele unterschiedliche Punktzahlen es für jedes Fachwissen in unserer Tabelle gibt, indem Sie diese Abfrage ausführen:

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

Hier ist das Ergebnis:

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

Aus dieser Abfrage können wir erkennen, dass die Expertise Beginner 51 unterschiedliche Punktzahlen hat, Intermediary 10 unterschiedliche Punktzahlen hat, Expert 30 unterschiedliche Punktzahlen hat und Master 10 unterschiedliche Punktzahlen hat. Die Abfrage dauerte 14 Sekunden und 515 Millisekunden.

Wir können auch diese andere Abfrage ausführen, um die Anzahl der unterschiedlichen Bewertungen in der Tabelle zu ermitteln:

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

Diese neue Abfrage dauerte 12 Sekunden und 165 Millisekunden. Im zweiten Beispiel war die zweite Abfrage schneller, aber beide Abfragen funktionieren einwandfrei.

In diesem Lernprogramm haben wir besprochen, wie Sie unterschiedliche Werte in einem Feld erhalten und wie Sie unterschiedliche Werte in einem Feld basierend auf unterschiedlichen Werten eines anderen Felds erhalten.