給定Log表,查詢各用戶最長連續登錄天數。
`Log`
+----------------+---------+
| user_id | int |
| login_time | date |
+----------------+---------+
解題思路:1,給各用戶的登錄日期組內排序。用窗口函數ROW_NUMBER實現。
2,因為row_number是連續的,所以如果login_time-row_number是恆定的,說明用戶從該login_time算起是連續登錄的。
3,計算各用戶login_time-row_number這個差值的數量,也就是各用戶的連續登錄天數。
4,按用戶id聚合,找出各用戶最大的連續登錄天數。
答案:
WITH day_rank AS ( SELECT user_id, login_time, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_time) AS rank FROM Log), day_diff AS ( SELECT user_id, DATE_SUB(login_time, rank) AS diff FROM day_rank), continuous_day AS ( SELECT user_id, COUNT(*) AS cnt FROM day_diff GROUP BY user_id, diff); SELECT user_id, MAX(cnt) FROM continuous_day GROUP BY user_id;