如何使用SQL Server创建序列数据?

问题描述 投票:0回答:2

我有这样的数据。

身份证 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中实现这个。 任何建议将不胜感激。

sql sql-server t-sql gaps-and-islands
2个回答
0
投票

以下内容假设您始终希望他们被雇用时的日期。

如果这个逻辑不正确,请更新问题并更具体

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


0
投票

检查此解决方案是否适用于您的问题。

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

© www.soinside.com 2019 - 2024. All rights reserved.