开发者社区> 问答> 正文

SQL查询丢失的记录

我有一个表,其中包含员工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

展开
收起
祖安文状元 2020-01-05 14:54:40 455 0
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
    
    2020-01-05 14:54:55
    赞同 展开评论 打赏
问答分类:
SQL
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载