[英]Snowflake SQL - Count Distinct Users within descending time interval
我想計算過去 60 天的不同用戶數量,然后計算過去 59 天的不同用戶數量,依此類推。
理想情況下,輸出看起來像這樣(目標輸出)
Day Distinct Users
60 200
59 200
58 188
57 185
56 180
[...] [...]
其中 60 天是最大可能的不同用戶總數,然后 59 會少一點,依此類推。
我的查詢看起來像這樣。
select
count(distinct (case when datediff(day,DATE,current_date) <= 60 then USER_ID end)) as day_60,
count(distinct (case when datediff(day,DATE,current_date) <= 59 then USER_ID end)) as day_59,
count(distinct (case when datediff(day,DATE,current_date) <= 58 then USER_ID end)) as day_58
FROM Table
我的查詢的問題是,這按列而不是按行輸出數據(如下所示)並且,最重要的是,我必須為 60 天的每一天寫出這個邏輯 60 倍。
電流輸出:
Day_60 Day_59 Day_58
209 207 207
是否可以按照上面最初所示的創建目標的方式編寫 SQL?
獲得當前輸出后,您可以執行 unpivot。 樣品一。
select
*
from (
select
209 Day_60,
207 Day_59,
207 Day_58
)unpivot ( cnt for days in (Day_60,Day_59,Day_58));
使用以下 CTE 格式的數據 -
with data_cte(dates,userid) as
(select * from values
('2022-05-01'::date,'UID1'),
('2022-05-01'::date,'UID2'),
('2022-05-02'::date,'UID1'),
('2022-05-02'::date,'UID2'),
('2022-05-03'::date,'UID1'),
('2022-05-03'::date,'UID2'),
('2022-05-03'::date,'UID3'),
('2022-05-04'::date,'UID1'),
('2022-05-04'::date,'UID1'),
('2022-05-04'::date,'UID2'),
('2022-05-04'::date,'UID3'),
('2022-05-04'::date,'UID4'),
('2022-05-05'::date,'UID1'),
('2022-05-06'::date,'UID1'),
('2022-05-07'::date,'UID1'),
('2022-05-07'::date,'UID2'),
('2022-05-08'::date,'UID1')
)
查詢以獲取所有日期和計數以及不同的計數 -
select dates,count(userid) cnt, count(distinct userid) cnt_d
from data_cte
group by dates;
日期 | 碳納米管 | CNT_D |
---|---|---|
2022-05-01 | 2 | 2 |
2022-05-02 | 2 | 2 |
2022-05-03 | 3 | 3 |
2022-05-04 | 5 | 4 |
2022-05-05 | 1 | 1 |
2022-05-06 | 1 | 1 |
2022-05-08 | 1 | 1 |
2022-05-07 | 2 | 2 |
查詢以獲取與當前日期的日期差
select dates,datediff(day,dates,current_date()) ddiff,
count(userid) cnt,
count(distinct userid) cnt_d
from data_cte
group by dates;
日期 | DDIFF | 碳納米管 | CNT_D |
---|---|---|---|
2022-05-01 | 45 | 2 | 2 |
2022-05-02 | 44 | 2 | 2 |
2022-05-03 | 43 | 3 | 3 |
2022-05-04 | 42 | 5 | 4 |
2022-05-05 | 41 | 1 | 1 |
2022-05-06 | 40 | 1 | 1 |
2022-05-08 | 38 | 1 | 1 |
2022-05-07 | 39 | 2 | 2 |
僅獲取日期差異超出特定范圍having
記錄 - 包含子句
select datediff(day,dates,current_date()) ddiff,
count(userid) cnt,
count(distinct userid) cnt_d
from data_cte
group by dates
having ddiff<=43;
DDIFF | 碳納米管 | CNT_D |
---|---|---|
43 | 3 | 3 |
42 | 5 | 4 |
41 | 1 | 1 |
39 | 2 | 2 |
38 | 1 | 1 |
40 | 1 | 1 |
如果您需要為每個日期差異計數添加“天”前綴,您可以將外部查詢添加到先前獲取的數據集,並將所需的前綴添加到日期差異列,如下所示 -
我正在使用 CTE 語法,但您可以使用子查詢,因為您將從表中選擇 -
,cte_1 as (
select datediff(day,dates,current_date()) ddiff,
count(userid) cnt,
count(distinct userid) cnt_d
from data_cte
group by dates
having ddiff<=43)
select 'day_'||to_char(ddiff) days,
cnt,
cnt_d
from cte_1;
天 | 碳納米管 | CNT_D |
---|---|---|
第 43 天 | 3 | 3 |
第 42 天 | 5 | 4 |
第 41 天 | 1 | 1 |
第 39 天 | 2 | 2 |
day_38 | 1 | 1 |
第 40 天 | 1 | 1 |
更新了答案以獲取不同天數范圍內的不同用戶計數。 可以在最終查詢中包含一個子句以限制所需的天數。
with data_cte(dates,userid) as
(select * from values
('2022-05-01'::date,'UID1'),
('2022-05-01'::date,'UID2'),
('2022-05-02'::date,'UID1'),
('2022-05-02'::date,'UID2'),
('2022-05-03'::date,'UID5'),
('2022-05-03'::date,'UID2'),
('2022-05-03'::date,'UID3'),
('2022-05-04'::date,'UID1'),
('2022-05-04'::date,'UID6'),
('2022-05-04'::date,'UID2'),
('2022-05-04'::date,'UID3'),
('2022-05-04'::date,'UID4'),
('2022-05-05'::date,'UID7'),
('2022-05-06'::date,'UID1'),
('2022-05-07'::date,'UID8'),
('2022-05-07'::date,'UID2'),
('2022-05-08'::date,'UID9')
),cte_1 as
(select datediff(day,dates,current_date()) ddiff,userid
from data_cte), cte_2 as
(select distinct ddiff from cte_1 )
select cte_2.ddiff,
(select count(distinct userid)
from cte_1 where cte_1.ddiff <= cte_2.ddiff) cnt
from cte_2
order by cte_2.ddiff desc
DDIFF | 碳納米管 |
---|---|
47 | 9 |
46 | 9 |
45 | 9 |
44 | 8 |
43 | 5 |
42 | 4 |
41 | 3 |
40 | 1 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.