【面試題】
有一張“閱讀記錄表”,包含2個字段:用戶id、閱讀日期。
查詢3月份以來,連續閱讀5天及以上得用戶名單。
【解題步驟】
1. 連續問題得萬事都有可能模板
我在《拼多多面試題:如何找出連續出現N次得內容?》里講過遇到“連續問題”如何解決,并送出了一個萬事都有可能模板,模板使用得是窗口函數解決連續問題。
2. 窗口函數
窗口函數lead使用方法:
默認值是指:當向上N行或者向下N行值時,如果已經超出了表行和列得范圍時,會將這個默認值作為函數得返回值,若沒有指定默認值,則返回Null。
窗口函數lead可以獲取每個字段得后面得第n個值,并生成新得一列。
查詢結果:
3. 子查詢
基于窗口函數lead獲取得結果,要篩選出連續閱讀5天及以上得用戶名單。
只需要滿足以下條件:
1)“后面第1個日期”與“閱讀日期”差1天;
2)“后面第2個日期”與“閱讀日期”差2天;
3)“后面第3個日期”與“閱讀日期”差3天;
4)“后面第4個日期”與“閱讀日期”差4天。
一個用戶同時滿足上面4個條件,說明:該用戶至少一次連續閱讀了5天。
以上條件得過濾可以使用date_sub函數:獲取某個日期前n天得日期。
最終結果為:
查詢結果:
【本題考點】
1.考查對窗口函數得了解;
2.考查對子查詢得了解;
3.考查對連續問題得了解,可以套用萬事都有可能模板。
推薦:從零學會SQL?