MySQL按user_id计算用户最后两次操作间隔天数,单操作算至今日
实现思路
- 第一步:给每个用户的操作记录按
date倒序编号,同时统计每个用户的总操作次数 - 第二步:过滤出每个用户最多前2条操作记录(足够计算所需差值)
- 第三步:按
user_id分组判断:如果用户总操作数≥2,取最后两条记录的日期间隔;如果只有1条,取操作日期到今日的天数
适用MySQL 8.0+的查询语句
以下示例表名为user_action,请替换为你的实际表名:
WITH ranked_actions AS ( SELECT user_id, `date`, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY `date` DESC) AS rn, COUNT(*) OVER (PARTITION BY user_id) AS action_cnt FROM user_action ) SELECT user_id, CASE WHEN action_cnt >= 2 THEN DATEDIFF(MAX(`date`), MIN(`date`)) ELSE DATEDIFF(CURDATE(), `date`) END AS num_days FROM ranked_actions WHERE rn <= 2 GROUP BY user_id, action_cnt;
兼容MySQL 5.x的查询语句
如果使用不支持窗口函数的低版本MySQL,可以用以下方案:
SELECT a.user_id, CASE WHEN COUNT(*) >= 2 THEN DATEDIFF(MAX(a.`date`), SUBSTRING_INDEX(GROUP_CONCAT(a.`date` ORDER BY a.`date` DESC), ',', 2)) ELSE DATEDIFF(CURDATE(), MAX(a.`date`)) END AS num_days FROM user_action a GROUP BY a.user_id;
注:低版本方案依赖
GROUP_CONCAT函数,单用户操作量极大的场景需要提前调整group_concat_max_len参数避免内容截断,常规业务场景无需额外调整。
内容的提问来源于stack exchange,提问作者user17564816
相关产品推荐
相关产品推荐

