验证计算每个用户活跃日期最大间隔的SQL查询有效性的技术问询
验证计算每个用户活跃日期最大间隔的SQL查询有效性的技术问询
首先得说,你提供的这段SQL解决方案和当前的任务完全不匹配哦,咱们先理清楚问题:
原始需求是从gamers表中计算每个用户活跃日期之间的最大间隔——比如用户1的最大间隔是3天(2019-01-02到2019-01-05),用户2是30天(2019-03-01到2019-03-31),用户3只有一条记录所以返回null。但你给出的SQL里用到了gamers2、total_amount_spent、country这些原始表中根本不存在的对象和字段,逻辑方向也完全偏离了日期间隔计算的需求,是没法得到正确结果的。
那咱们来写符合需求的正确查询方案,核心思路是:
- 给每个用户的活跃日期按时间排序,匹配出下一条活跃日期
- 计算相邻日期的间隔天数
- 对每个用户取间隔天数的最大值,无间隔的用户返回null
具体SQL代码如下:
WITH user_dates AS ( SELECT user_id, active_date, -- 用窗口函数获取当前用户的下一条活跃日期 LEAD(active_date) OVER (PARTITION BY user_id ORDER BY active_date) AS next_active_date FROM gamers ), date_gaps AS ( SELECT user_id, -- 计算两次活跃的间隔天数 DATEDIFF(next_active_date, active_date) AS gap_days FROM user_dates -- 过滤掉没有下一条日期的记录(用户最后一次活跃) WHERE next_active_date IS NOT NULL ) SELECT g.user_id, -- 左连接确保只有一条记录的用户能返回null MAX(gd.gap_days) AS max_gap_days FROM gamers g LEFT JOIN date_gaps gd ON g.user_id = gd.user_id GROUP BY g.user_id ORDER BY g.user_id;
测试这段查询后,结果会完全符合需求:
- user_id 1:max_gap_days = 3
- user_id 2:max_gap_days = 30
- user_id 3:max_gap_days = null
备注:内容来源于stack exchange,提问作者DNAProgrammer
相关产品推荐
相关产品推荐

