簡體   English   中英

SQL在每個日期的一行中獲取不同用戶類型的計數

[英]SQL get count of distinct user types in one row per date

我有一個國家列表,對於每個國家我都有一個這樣的表(第一列: user ,第二列: user_type ,第三列: date ):

用戶 用戶類型 日期
用戶1 國家的 2022-10-01
用戶1 國家的 2022-10-01
用戶2 國家的 2022-10-01
用戶2 國際的 2022-10-01
用戶3 國家的 2022-10-02
用戶1 未知 2022-10-02
用戶1 國家的 2022-10-03

我想每天一行獲取每種類型的所有不同用戶,如下所示(4 列:日期、first_user_type、second_user_type、third_user_type):

日期 first_user_type second_user_type 第三用戶類型
2022-10-01 2個 1個 0
2022-10-02 1個 0 1個
2022-10-03 1個 0 0

但是,如果我運行此查詢:

SELECT 
date, user_type, COUNT(distinct user) as num_users
FROM "country"."table" 
WHERE 
date between '2022-10-01' AND '2022-10-03' 
GROUP BY date, user_type 
ORDER BY date, user_type

然后我獲得了正確的結果,但在不同的行中具有相同的日期,如下所示:

日期 用戶類型 用戶數
2022-10-01 國家的 2個
2022-10-01 國際的 1個
2022-10-01 未知 0
2022-10-02 國家的 1個
2022-10-02 國際的 0
2022-10-02 未知 1個
2022-10-03 國家的 1個
2022-10-03 國際的 0
2022-10-03 未知 0

但是還有一個額外的難點:全球有3種user_types :“National”、“International”和“Unknown”,但問題是有些國家只有“National”,或者“National”和“Unknown”(沒有“International” "),並且我希望結果顯示為 0(即使該user_type在該國家/地區不存在)。 所有國家的查詢都應該相同,只是更改“ country ”。

(PS:查詢應該在 AWS Athena 中運行)

有任何想法嗎?

條件聚合應該在這里做:

SELECT date_, 
       COUNT(DISTINCT IF(user_type = 'National'     , user_, NULL)) AS numNational,
       COUNT(DISTINCT IF(user_type = 'International', user_, NULL)) AS numInternational,
       COUNT(DISTINCT IF(user_type = 'Unknown'      , user_, NULL)) AS numUnknown
FROM tab
GROUP BY date_

此處查看演示。

SELECT date,
       SUM(CASE WHEN user_type = 'National' THEN 1 ELSE 0 END) AS National,
       SUM(CASE WHEN user_type = 'International' THEN 1 ELSE 0 END) AS International,
       SUM(CASE WHEN user_type = 'Unknown' THEN 1 ELSE 0 END) AS Unknown
FROM "country"."table"
WHERE date BETWEEN '2022-10-01' AND '2022-10-03'
GROUP BY date

我希望這有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM