PostgreSQL 不同的欄位值計數
獲取欄位中的不同值是一個重要的查詢。本教程討論如何獲取欄位中值的不同計數。
獲取 PostgreSQL 中欄位值的不同計數
考慮一個 quiz_score 表,它記錄了問答遊戲中每個參與者的分數。
| 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 | 
下面是表的 CREATE 語句:
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)
);
這是用資料填充表的 INSERT 語句:
INSERT INTO quiz_score (player_id, score)
SELECT i, floor(random()*(100-0+1))
FROM generate_series(1,10000000) i;
我們已將一千萬個隨機分數插入到我們的表中。讓我們通過執行以下查詢來找出表中有多少不同的分數:
SELECT COUNT(DISTINCT score) FROM quiz_score;
此查詢耗時 3 秒 391 毫秒,計數為 101 個不同的值。
我們還可以執行這個其他查詢來查詢表中不同分數的數量:
SELECT COUNT(*) FROM (SELECT DISTINCT score FROM quiz_score) AS DistinctScores;
這個新查詢花費了 1 秒和 572 毫秒,計數了 101 個不同的值。
如我們所見,第二個查詢更快。任何一個查詢都可以正常工作,但在這種情況下,第二個查詢更快。
根據 PostgreSQL 中的另一個欄位獲取欄位值的不同計數
我們現在將介紹一個名為 Expertise 的新欄目。該欄位是根據玩家的得分填充的。
Expertise 值是:Beginner、Intermediary、Expert 和 Master。玩家的專長由玩家的分數決定,如下所示:
| Expertise | score | 
|---|---|
| Beginner | 0 - 50 | 
| Intermediary | 51 - 80 | 
| Expert | 81 - 90 | 
| Master | 91 - 100 | 
新更新的 quiz_score 表是:
| 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 | 
這是用於將新列新增到表中的 ALTER TABLE 語句:
ALTER TABLE quiz_score ADD COLUMN expertise text;
這是填充專業知識領域的 UPDATE 語句:
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);
在前面的示例中,我們檢視了表中不同的分數。在此示例中,讓我們通過執行以下查詢來找出表中每種專業知識有多少不同的分數:
SELECT expertise, COUNT(DISTINCT score)
FROM quiz_score
GROUP BY expertise
結果如下:
  expertise   | count
--------------+-------
 Beginner     |    51
 Intermediary |    10
 Expert       |    30
 Master       |    10
從這個查詢中,我們可以看出 Beginner 專業有 51 個不同的分數,Intermediary 有 10 個不同的分數,Expert 有 30 個不同的分數,而 Master 有 10 個不同的分數。查詢耗時 14 秒和 515 毫秒。
我們還可以執行這個其他查詢來查詢表中不同分數的數量:
SELECT
    DISTINCT ON (expertise) expertise,
    COUNT(DISTINCT score)
FROM
    quiz_score
GROUP BY expertise
這個新查詢耗時 12 秒和 165 毫秒。在第二個示例中,第二個查詢更快,但任何一個查詢都可以正常工作。
在本教程中,我們討論瞭如何在一個欄位中獲取不同的值,以及如何根據另一個欄位的不同值在一個欄位中獲取不同的值。