我有一个表,其中包含员工ID,状态,操作和操作日期。我需要为员工创建一个月标记,以查看该员工在一年中的任何月份是否处于活动状态。由于我只有可用的操作日期,所以几个月以来数据丢失了。
例
Employee Id - AAC1000632860QSG ,该员工于2008年4月1日被聘用,并于2012年8月1日离职,因此我需要创建一个标志或字段,以帮助我识别该员工在4月,5月,6月等到11月为止是活跃的,这适用于所有两个动作之间的月份。
我需要为2个动作之间的缺失行填充所有列,并使用前一个非空白行的值。
我希望我能够解释我的问题,并希望我能找到解决方案。
MASKID Status Reason Action Start_Date MonthDiff
AAC1000632860QSG Active Hire001 Hire 2008-04-01 23
AAC1000632860QSG Active DATACHG01 Data Change 2010-03-31 1
AAC1000632860QSG Active DATACHG01 Data Change 2010-04-01 0
AAC1000632860QSG Active DATACHG01 Data Change 2010-04-29 2
AAC1000632860QSG Active TRANSFER01 Transfer 2010-06-01 2
AAC1000632860QSG Active DATACHG01 Data Change 2010-08-01 1
AAC1000632860QSG Active DATACHG01 Data Change 2010-09-01 4
AAC1000632860QSG Active DATACHG01 Data Change 2011-01-01 3
AAC1000632860QSG Active DATACHG01 Data Change 2011-04-01 4
AAC1000632860QSG Active DATACHG01 Data Change 2011-08-01 12
AAC1000632860QSG Separated YC Separation 2012-08-01
预期产量:
MASKID Status Reason Action Start_Date MonthDiff
===================================================================
AAC1000632860QSG Active TRANSFER01 Transfer 2010-06-01 2
AAC1000632860QSG Active DATACHG01 Data Change 2010-08-01 1
您可以使用递归CTE按月展开它们。
例如。
样本数据:
CREATE TABLE YourEmployeeDataTable
(
MASKID VARCHAR(16) NOT NULL,
Status VARCHAR(10) NOT NULL,
Reason VARCHAR(30) NOT NULL,
Action VARCHAR(30) NOT NULL,
Start_Date DATE NOT NULL,
MonthDiff INT
);
INSERT INTO YourEmployeeDataTable
(MASKID, Status, Reason, Action, Start_Date, MonthDiff) VALUES
('AAC1000632860QSG', 'Active', 'Hire001', 'Hire', '2008-04-01', 23)
, ('AAC1000632860QSG', 'Active', 'DATACHG01', 'Data Change', '2010-03-31', 1)
, ('AAC1000632860QSG', 'Active', 'DATACHG01', 'Data Change', '2010-04-01', 0)
, ('AAC1000632860QSG', 'Active', 'DATACHG01', 'Data Change', '2010-04-29', 2)
, ('AAC1000632860QSG', 'Active', 'TRANSFER01', 'Transfer', '2010-06-01', 2)
, ('AAC1000632860QSG', 'Active', 'DATACHG01', 'Data Change', '2010-08-01', 1)
, ('AAC1000632860QSG', 'Active', 'DATACHG01', 'Data Change', '2010-09-01', 4)
, ('AAC1000632860QSG', 'Active', 'DATACHG01', 'Data Change', '2011-01-01', 3)
, ('AAC1000632860QSG', 'Active', 'DATACHG01', 'Data Change', '2011-04-01', 4)
, ('AAC1000632860QSG', 'Active', 'DATACHG01', 'Data Change', '2011-08-01', 12)
, ('AAC1000632860QSG', 'Separated', 'YC', 'Separation', '2012-08-01', null)
查询:
WITH RCTE_EMP_DATES AS
(
SELECT MASKID, Status, Reason, Action
, Start_Date AS startDate
, LEAD(Start_Date,1,Start_Date) OVER (PARTITION BY MASKID ORDER BY Start_Date) AS endDate
, IIF(MonthDiff>0,1,0) AS MonthDiff
, 0 AS lvl
FROM YourEmployeeDataTable
UNION ALL
SELECT MASKID, Status, null, null
, DATEADD(DAY,1,EOMONTH(DATEADD(month,1,startDate),-1))
, endDate
, 1
, lvl + 1
FROM RCTE_EMP_DATES
WHERE startDate < DATEADD(month,-1,endDate)
)
SELECT *
FROM RCTE_EMP_DATES
ORDER BY MASKID, startDate
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。