1. 程式人生 > >oracle 通過分析函式實現求連續天數登陸的使用者

oracle 通過分析函式實現求連續天數登陸的使用者

首先給出一些樣例資料:

使用者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
這是使用者ID:1的7月份的登陸日誌情況,簡單說明一下,3號有兩條重複的資料,表明3號使用者登陸了2次,14號使用者登陸了3次,即一天使用者可能登陸N次,產生重複的資料。所以必須先去重。

具體演算法說明:

1 首先去重得到資料集 T

2 在去重的資料集上通過分析函式over按user_id對日期login_day進行組內排序獲得序號row_number(),並用日期減去當前組內排序號得到一個差值rn

3 按user_id和差值rn進行GROUP BY,取COUNT>=7的記錄去重得最終結果

具體SQL如下:

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
這裡統計2014年7月份連續登陸>=7天的使用者ID,還有連續登陸的起止日期。

同樣在hive中好像也有row_number() over分析函式,後面再研究一下hive的寫法。