如何使用partition函数筛选员工所属州与在职状态变更记录
窗口函数实现变更行筛选方案
可以通过LAG()窗口函数配合分区(PARTITION)实现需求,无需复杂自关联操作。
假设你的源表结构为employee_status_records,包含核心字段:
employee_id:员工唯一标识record_date:记录日期state:员工所属州employment_status:在职状态,取值为Active/Inactive
参考实现SQL如下:
WITH employee_records_with_prev AS ( SELECT *, -- 按员工分区,取同员工上一条记录的所属州 LAG(state) OVER (PARTITION BY employee_id ORDER BY record_date ASC) AS prev_state, -- 取同员工上一条记录的在职状态 LAG(employment_status) OVER (PARTITION BY employee_id ORDER BY record_date ASC) AS prev_employment_status FROM employee_status_records ) SELECT * FROM employee_records_with_prev WHERE -- 条件1:所属州发生切换(空值兼容可按需调整COALESCE的默认值) COALESCE(state, '') <> COALESCE(prev_state, '') -- 条件2:在职状态从非活跃变为活跃 OR (prev_employment_status = 'Inactive' AND employment_status = 'Active')
注意事项
- 分区键
PARTITION BY后需替换为你表中实际的员工唯一标识字段 - 排序键
ORDER BY后需替换为你表中实际的日期字段,保证同员工的记录按时间顺序排列 - 若不需要返回员工首次录入的记录(即没有上一条匹配记录的首行),可额外加筛选条件
prev_state IS NOT NULL即可
内容的提问来源于stack exchange,提问作者From The Bayou
相关产品推荐
相关产品推荐

