1. 程式人生 > 資料庫 >SQL經典面試題-連續3天登陸使用者 (:機會終於來了系列

SQL經典面試題-連續3天登陸使用者 (:機會終於來了系列

寫在前面

連續登陸問題可以擴充套件到很多其他方面:
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);