前言
就一直向前走吧,沿途的花終將綻放~
題目:找出連續活躍3天及以上的用戶
create table t_useractive(uid string,dt string
);insert into t_useractive
values('A','2023-10-01'),('A','2023-10-02'),('A','2023-10-03'),('A','2023-10-04'),('B','2023-10-01'),('B','2023-10-03'),('B','2023-10-04'),('B','2023-10-05'),('C','2023-10-01'),('C','2023-10-03'),('C','2023-10-05'),('C','2023-10-06'),('D','2023-10-02'),('D','2023-10-03'),('D','2023-10-05'),('D','2023-10-06');
hsql:
select uid
from (
select uid
from(select uid,dt,row_number() over (partition by uid order by dt) rn,date_sub(dt, row_number() over (partition by uid order by dt)) c1from t_useractive
) t1 group by uid,c1
having count(*) >= 3
)
t2 group by uid;
hsql分析:
子查詢 t1:
- 從
t_useractive
表中選擇uid
、dt
。- 使用
row_number() over (partition by uid order by dt)
為每個用戶的活動記錄分配一個行號(按照日期排序)。這個行號被命名為rn
。- 接下來,計算一個名為
c1
的字段,該字段是日期dt
減去行號rn
的結果。這樣做的目的是為了標記連續的日期,因為對于連續的日期,date_sub(dt, rn)
的結果將是相同的。子查詢 t1 的分組:
- 使用
group by uid, c1
對子查詢t1
的結果進行分組。由于c1
字段對于連續的日期是相同的,因此這將把連續的日期記錄分組在一起。having count(*) >= 3:
- 篩選出那些組中記錄數大于或等于3的組,這意味著這些組代表了連續3天或更多的活動。
外部查詢 t2:
- 由于內部查詢已經篩選出了連續3天或更多的活動組,外部查詢只需簡單地按
uid
進行分組,并選擇uid
字段。這一步是為了確保每個用戶只被列出一次,即使他們在不同的時間段內有多個連續的3天或更多天的活動。最終,這個查詢將返回所有在
t_useractive
表中至少有連續3天活動的用戶的uid
。