oracle 通過分析函式實現求連續天數登陸的使用者
阿新 • • 發佈:2019-02-15
首先給出一些樣例資料:
使用者ID | 登陸時間(年) | 登陸時間(月) | 登陸時間(日) |
1 | 2014 | 7 | 1 |
1 | 2014 | 7 | 2 |
1 | 2014 | 7 | 3 |
1 | 2014 | 7 | 3 |
1 | 2014 | 7 | 4 |
1 | 2014 | 7 | 5 |
1 | 2014 | 7 | 5 |
1 | 2014 | 7 | 7 |
1 | 2014 | 7 | 8 |
1 | 2014 | 7 | 9 |
1 | 2014 | 7 | 10 |
1 | 2014 | 7 | 11 |
1 | 2014 | 7 | 12 |
1 | 2014 | 7 | 13 |
1 | 2014 | 7 | 14 |
1 | 2014 | 7 | 14 |
1 | 2014 | 7 | 14 |
1 | 2014 | 7 | 15 |
1 | 2014 | 7 | 19 |
1 | 2014 | 7 | 21 |
1 | 2014 | 7 | 22 |
1 | 2014 | 7 | 23 |
1 | 2014 | 7 | 29 |
1 | 2014 | 7 | 30 |
1 | 2014 | 7 | 31 |
具體演算法說明:
1 首先去重得到資料集 T
2 在去重的資料集上通過分析函式over按user_id對日期login_day進行組內排序獲得序號row_number(),並用日期減去當前組內排序號得到一個差值rn
3 按user_id和差值rn進行GROUP BY,取COUNT>=7的記錄去重得最終結果
具體SQL如下:
這裡統計2014年7月份連續登陸>=7天的使用者ID,還有連續登陸的起止日期。select distinct user_id,min(login_day),max(login_day) from (select t.*, trunc(t.login_day - row_number() over(partition by t.user_id order by t.login_day)) rn from (select distinct * from login_history) t where t.login_year=2014 and t.login_month=7) group by user_id, rn having count(1)>=7
同樣在hive中好像也有row_number() over分析函式,後面再研究一下hive的寫法。