我有 3 張桌子:
TABLE: session_log
user_id | device | logged_on
---------|--------|---------------------
1 | web | 2022-01-01 12:43:25
1 | web | 2022-01-01 13:33:32
2 | mobile | 2022-01-01 18:20:18
1 | mobile | 2022-01-01 08:22:41
2 | web | 2022-01-01 09:10:16
3 | web | 2022-01-01 07:52:21
1 | web | 2022-01-02 10:42:14
TABLE: standard_users
user_id | username
---------|-----------
1 | adam
2 | jennifer
TABLE: admin_users
user_id | username
---------|-----------
3 | george
我想計算每天和每種設備型別(移動設備或網路)的唯一非管理員(標準)用戶的數量。另一個需要注意的是,如果用戶在同一天同時登錄了網路和移動設備,我仍然希望將它們包括在兩種設備型別的計數中,但當天每個設備不超過一次。
從上面的表格記錄中,我想得到的結果應該如下所示:
login_date | mobile_count | web_count
------------|--------------|-----------
2022-01-01 | 2 | 2
2022-01-02 | 0 | 1
目前我有一個查詢沒有考慮唯一用戶條件,我無法弄清楚如何修改它以同時考慮每個計數的唯一用戶 ID。
SELECT
s.logged_on::date AS login_date,
sum(CASE WHEN s.device = 'mobile' THEN 1 ELSE 0 END) AS mobile_count,
sum(CASE WHEN s.device = 'web' THEN 1 ELSE 0 END) AS web_count,
FROM session_log s
LEFT JOIN standard_users su ON su.user_id = s.user_id
WHERE su.user_id IS NOT NULL
GROUP BY login_date;
到目前為止,當在上面的示例資料上運行時,我目前的上述查詢為 web_count 提供了 3,因為它沒有計算 user_id 的唯一性,所以它在user_id1 月 1 日兩次計算 1 的記錄。
有沒有辦法修改我的查詢以user_id在執行每個總和時也考慮到唯一性?
uj5u.com熱心網友回復:
使用聚合FILTER子句。然后您可以將您的計數與DISTINCT:
SELECT s.logged_on::date AS login_date
, count(*) FILTER (WHERE s.device = 'mobile') AS mobile_count
, count(DISTINCT user_id) FILTER (WHERE s.device = 'web') AS web_count
FROM session_log s
JOIN standard_users su USING (user_id)
GROUP BY login_date;
看:
- 使用其他(不同的)過濾器聚合列
LEFT JOIN我還用then簡化了你的扭曲公式IS NOT NULL。歸結為平淡無奇JOIN。
session_log.user_id如果和之間的參照完整性standard_users.user_id通過 FK 約束強制執行,并且standard_users.user_id定義為 UNIQUE 或 PK - 看起來很合理 - 您可以JOIN完全放棄:
SELECT logged_on::date AS login_date
, count(*) FILTER (WHERE device = 'mobile') AS mobile_count
, count(DISTINCT user_id) FILTER (WHERE device = 'web') AS web_count
FROM session_log
GROUP BY 1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446069.html
