我有这样的数据。
身份证 | prev_org | 组织 | 活动 | 活动日期 |
---|---|---|---|---|
1 | - | A | 雇用 | 202301 |
1 | A | B | 转让 | 202304 |
2 | - | A | 雇用 | 202301 |
2 | - | A | 离开 | 202304 |
2 | - | A | 返回 | 202311 |
2 | A | B | 转让 | 202401 |
而我想要实现的就是这样的。
身份证 | prev_org | 组织 | 活动 | prev_org_start_date | 活动日期 |
---|---|---|---|---|---|
1 | - | A | 雇用 | - | 202301 |
1 | A | B | 转让 | 202301 | 202304 |
2 | - | A | 雇用 | - | 202301 |
2 | - | A | 离开 | - | 202304 |
2 | - | A | 返回 | - | 202311 |
2 | A | B | 转让 | 202301 | 202401 |
简而言之,我想知道每个员工属于同一组织多久了。 员工A于2023年1月加入公司,一直在组织A工作,直到2023年4月调到组织B。 因此,该员工从 2023 年 1 月起就在组织 A 中,因此“prev_org_start_date”列为 202301。
另一方面,员工 B 休假并重返工作岗位,但从 2023 年 1 月到 2024 年 1 月搬迁期间一直在组织 A,因此“prev_org_start_date”列将为 202301。
由于公司的开发环境,我需要在SQL Server中实现这个。 任何建议将不胜感激。
以下内容假设您始终希望他们被雇用时的日期。
如果这个逻辑不正确,请更新问题并更具体
DECLARE @t TABLE (ID int, prev_org varchar(10), org varchar(10), event varchar(10), event_date int)
INSERT INTO @t values
(1, '-', 'A', 'Hire', 202301),
(1, 'A', 'B', 'Transfer', 202304),
(2, '-', 'A', 'Hire', 202301),
(2, '-', 'A', 'Leave', 202304),
(2, '-', 'A', 'Return', 202311),
(2, 'A', 'B', 'Transfer', 202401)
SELECT
t.ID,
t.prev_org,
t.org,
t.event,
h.event_date as Prev_org_start_date,
t.event_date
FROM @t t
LEFT JOIN (SELECT ID, Org, event_date FROM @t WHERE event = 'Hire') h
on t.id = h.id and t.prev_org = h.org
这是一个工作小提琴,以便您可以看到结果。
https://sqlfiddle.com/sql-server/online-compiler?id=82898dc8-e450-4841-b27c-54f66bf4cc9f
检查此解决方案是否适用于您的问题。
SELECT
id,
prev_org,
org,
event,
CASE
WHEN event = 'transfer' THEN min(event_date) OVER(PARTITION BY id ORDER BY event_date)
ELSE null
END prev_org_start_date,
event_date
FROM employee_events