SQL实现单行列转多行:状态变更日期列转状态-时间戳行
需求与SQL实现
输入数据
| story_id | sched_state | story_being_groomed_ts | story_def_ts | story_in_prgrs_ts | story_cmpl_ts |
|---|---|---|---|---|---|
| 1 | completed | 2023-01-01 | 2023-01-13 | 2023-01-20 | 2023-01-23 |
| 2 | inprogress | 2023-01-01 | 2023-01-10 | 2023-01-30 |
输出要求
将上述单行多阶段数据转换为多行单阶段数据,仅保留存在时间戳的阶段,输出格式如下:
| story_id | sched_state | last_up_ts |
|---|---|---|
| 1 | Groomed | 2023-01-01 |
| 1 | Defined | 2023-01-13 |
| 1 | inprogress | 2023-01-20 |
| 1 | Completed | 2023-01-23 |
| 2 | Groomed | 2023-01-01 |
| 2 | Defined | 2023-01-10 |
| 2 | inprogress | 2023-01-30 |
实现SQL语句
SELECT story_id, 'Groomed' AS sched_state, story_being_groomed_ts AS last_up_ts FROM your_table_name WHERE story_being_groomed_ts IS NOT NULL UNION ALL SELECT story_id, 'Defined' AS sched_state, story_def_ts AS last_up_ts FROM your_table_name WHERE story_def_ts IS NOT NULL UNION ALL SELECT story_id, 'inprogress' AS sched_state, story_in_prgrs_ts AS last_up_ts FROM your_table_name WHERE story_in_prgrs_ts IS NOT NULL UNION ALL SELECT story_id, 'Completed' AS sched_state, story_cmpl_ts AS last_up_ts FROM your_table_name WHERE story_cmpl_ts IS NOT NULL ORDER BY story_id, last_up_ts;
逻辑说明
- 用
UNION ALL合并四个阶段的查询结果,每个子查询对应一个业务阶段,将原表的时间戳字段映射为last_up_ts,同时指定对应的阶段名称作为sched_state - 每个子查询通过
WHERE子句过滤掉时间戳为空的记录,确保只生成存在的阶段行 - 最后通过
ORDER BY按story_id和时间戳排序,保证阶段顺序符合业务流转逻辑
内容的提问来源于stack exchange,提问作者user20998231
相关产品推荐
相关产品推荐

