如何编写SQL查询仅返回项目状态发生变更的记录?
解决方案
要筛选出项目状态变更的记录,核心是对比每条记录与同项目上一条记录的状态差异,同时保留每个项目的初始状态记录。用窗口函数LAG()就能高效实现,具体如下:
假设你的表名为project_history,关键字段包括:
project_id:项目唯一标识status:项目状态change_timestamp:记录生成的时间戳(用于确定记录先后顺序)
SQL查询语句
SELECT * FROM ( SELECT *, -- 获取同项目的上一条记录状态 LAG(status) OVER (PARTITION BY project_id ORDER BY change_timestamp) AS prev_status FROM project_history ) AS ranked -- 筛选条件:项目第一条记录 或 当前状态与上一条不同 WHERE prev_status IS NULL OR status != prev_status;
逻辑说明
LAG(status) OVER (PARTITION BY project_id ORDER BY change_timestamp):按项目分组、时间戳排序,获取每组内当前记录的上一条状态值。- 外层查询筛选两类记录:
- 项目的第一条记录(
prev_status IS NULL),即初始的"In Progress"状态记录 - 当前状态与上一条状态不一致的记录,也就是发生状态变更的节点记录
- 项目的第一条记录(
这样就能精准提取所有状态变更相关的记录,覆盖从初始到最终完成的所有状态切换节点。
内容的提问来源于stack exchange,提问作者plankton
相关产品推荐
相关产品推荐

