如何根据is_active状态从creation_time提取start_date与end_date
解决方案:根据is_active状态生成start_date和end_date
针对你的需求,这里提供一个基于窗口函数的SQL查询方案,可以直接得到你期望的结果:
SELECT id, user_id, name, leader_name, is_active, creation_time AS start_date, CASE WHEN is_active = 1 THEN CURRENT_DATE() ELSE LEAD(creation_time) OVER (PARTITION BY user_id ORDER BY creation_time) END AS end_date, creation_time FROM your_table_name ORDER BY creation_time;
逻辑说明:
- start_date:直接复用当前记录的
creation_time,完全匹配示例中的结果规则 - end_date:
- 对于
is_active=1的活跃记录,用CURRENT_DATE()填充结束日期 - 对于非活跃记录(
is_active=0),使用LEAD()窗口函数,按user_id分组、creation_time升序排序,获取同用户下下一条记录的creation_time作为当前记录的结束日期
- 对于
- 最后按
creation_time排序,保证结果顺序和示例一致
注意事项:
- 确保你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server 2012+等)
- 如果是MySQL 5.x这类不支持窗口函数的版本,可以用关联查询实现,但窗口函数的方案更简洁高效
内容的提问来源于stack exchange,提问作者D_Q
相关产品推荐
相关产品推荐

