SQL經典面試題-連續3天登陸使用者 (:機會終於來了系列
阿新 • • 發佈:2020-12-04
寫在前面
連續登陸問題可以擴充套件到很多其他方面:
1.我們每天使用的某團外賣,就可以統計使用者連續點外賣的天數。如果發現你連續5天都沒有點外賣,可能就會給你發優惠券,刺激消費
2.比如銀行貸款你連續預期好多好多天,一直沒有處理。銀行就會按照自己的流程對你採集一定的措施。
反正就是確實在數倉中還是用的比較多的,比較實際的需求。
需求:編寫hql,統計連續3天登陸的使用者
分析:如何判斷連續,這個是本題的關鍵
可以對user_id進行分組排序後,得到rn,然後用登陸日期減去rn ,就會得到一個日期差,如果是連續的話,這個日期差值應該也是連續一致的。
SQL實現
select user_id, --date_sub(login_date, t1.rn) as date_flag, count(1) as cnt from ( select user_id, login_date, row_number() over(partition by user_id order by login_date asc) rn from user_login) t1 group by user_id, date_sub(login_date, t1.rn) having cnt >=3;
執行,得到正確結果
這裡還提供另外一種寫法:
select distinct user_id from ( select user_id, login_date, lead(login_date, 2, -1) over(partition by user_id order by login_date desc) as date_flag from user_login group by user_id,login_date) t1 where date_sub(cast(t1.login_date as date), 2) = cast(t1.date_flag as date);