簡體   English   中英

Snowflake SQL - 在遞減的時間間隔內計算不同的用戶

[英]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.

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