sql計算某個日期區間用戶連續登陸最大天數


例:測試數據如下表(user_login_table)

  

 

注:對於工作日(上周五和下周一也界定為連續),則方法二適用

實現思路一:

  1、使用開窗函數row_number() 對每個user_id 的登陸日期進行排序,得到排名rn

  2、然后用login_date減去排名rn,得到一個新的日期new_date字段,比如,‘2021-10-01’減去1得到‘2021-09-30’,‘2021-10-02’減去2得到‘2021-09-30’......,減完之后得到的日期相同,則說明登陸日期連續

  3、之后按user_id和new_date,進行計數,得到login_days

  4、最后按user_id分組,取每個user_id對應login_days的最大值,即為該user_id的最大登陸天數max_login_days

  

SQL:

  select user_id,max(login_days) max_login_days

    from (select user_id,new_date,count(*) login_days

      from (select user_id,

             login_date,

             row_number() over(partition by user_id order by login_date) rn,

             login_date - row_number() over(partition by user_id order by login_date) new_date

         from user_login_table)a

     group by user_id, new_date)b

   group by user_id;

 

 實現思路二:

  1、自己創建一個日期表(包含分析期間的所有日期),表名(dic_date_table)

  2、使用開窗函數row_number() 對每個user_id 的登陸日期進行排序,得到排名rn

  3、使用開窗函數row_number()日期表中的日期(dic_date)進行排序,得到rn_1

  4、將步驟2和3得到的結果,通過日期字段關聯,然后用rn_1 - rn得到 num

  5、之后按user_id和num,進行計數,得到login_days

  6、最后按user_id分組,取每個user_id對應login_days的最大值,即為該user_id的最大登陸天數max_login_days

 

    

 

  將上面兩表關聯(login_date = dic_date)得到以下結果:

 

  

 

 

 SQL:

  select T.user_id, max(login_days) max_login_days

    from (select t.user_id, t.num, count(*)  login_days

        from (select a.user_id, b.rn_1 - a.rn num

           from (select user_id,

                    login_date,

 

                 row_number() over(partition by user_id order by login_date) rn

 

                from user_login_table)a

     left join (select dic_date,

            row_number() over(order by dic_date) rn_1

              from dic_date_table)b

               on a.login_date = b.dic_date)t

     group by t.user_id, t.num)T

     group by T.user_id;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM