SQL Server - 查找缺席日期[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server - 查找缺席日期[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我有以下数据集:

在此输入图像描述

这是此数据的脚本:

;使用数据集AS(选择'EMP01'AS EMP_ID,CAST('2018-01-01'AS DATE)AS PERIOD_START,CAST('2018-01-31'作为日期)AS PERIOD_END,CAST('2018-01-07 'AS DATE)AS CUT_DATE UNION选择'EMP01'作为EMP_ID,CAST('2018-01-01'作为日期)AS PERIOD_START,CAST('2018-01-31'作为日期)AS PERIOD_END,CAST('2018-01 -15'作为日期)作为CUT_DATE UNION选择'EMP02'作为EMP_ID,CAST('2018-01-01'作为日期)AS PERIOD_START,CAST('2018-01-31'作为日期)AS PERIOD_END,CAST('2018 -01-09'AS DATE)AS CUT_DATE)select * from dataset我需要将这些期间(PERIOD_START和PERIOD_END)除以CUT_DATE(不包括那些期间的截止日期)切割日期的数量可以是任意的(3,5,8)等等)。

期望上面的数据集的结果是:

答案

如果您的SQL Server版本支持LAG,则可以使用此方法。

SELECT EMPLOYEE_ID,
       ITEM_TYPE,
       MIN(APPLY_DATE) AS STARTDATE,
       MAX(APPLY_DATE) AS ENDDATE
FROM
 (SELECT T.*,
         SUM(CASE WHEN PREV_TYPE=ITEM_TYPE THEN 0 ELSE 1 END) 
         OVER(PARTITION BY EMPLOYEE_ID ORDER BY APPLY_DATE) AS GRP
  FROM (SELECT D.*,
        LAG(ITEM_TYPE) OVER(PARTITION BY EMPLOYEE_ID ORDER BY APPLY_DATE) AS PREV_TYPE
        FROM DATA D
       ) T
  ) T
WHERE ITEM_TYPE IN ('Sickness','Vacation')
GROUP BY EMPLOYEE_ID,ITEM_TYPE,GRP

逻辑是获取前一行的item_type(基于apply_date的升序)并将其与当前行的值进行比较。如果它们相等,则它们属于同一组。否则你开始一个新的团队。这是在sum窗口函数中完成的。分配组后,您只需要获取employee_id,item_type的maxmin日期。

Sample Demo

另一答案

您将使用LAG功能。如果按某种顺序排序,LAG函数会给出之前的值;

完整的描述可以在:http://www.sqlservercentral.com/articles/T-SQL/106783/找到

查看vkp的完整查询答案

另一答案

如果支持lag,这是另一种方式。

Rextester Sample

with tbl as
(select d.*
    ,case when (item_type = lag(item_type) over (partition by employee_id order by apply_date))
            then 0 
            else 1 
    end grp_tmp
from DATA2 d
where 
    item_type <> 'Worked'
)
,tbl2 as 
(select t.*
    ,sum(grp_tmp) over (order by employee_id,apply_date 
                        rows between unbounded preceding and current row
                        ) 
    as grp
from tbl t
)
select 
EMPLOYEE_ID
    ,ITEM_TYPE 
    ,(CONVERT(VARCHAR(24),min(apply_date),103)
    +' - '
    +CONVERT(VARCHAR(24),max(apply_date),103)
    ) as range
from tbl2
group by EMPLOYEE_ID, 
        ITEM_TYPE
        ,grp
order by 
    employee_id
    ,min(apply_date);

产量

+-------------+-----------+-------------------------+
| EMPLOYEE_ID | ITEM_TYPE |          range          |
+-------------+-----------+-------------------------+
|           1 | Sickness  | 23/05/2017 - 24/05/2017 |
|           1 | Vacation  | 26/05/2017 - 29/05/2017 |
|           1 | Sickness  | 01/06/2017 - 01/06/2017 |
|           2 | Sickness  | 25/05/2017 - 30/05/2017 |
+-------------+-----------+-------------------------+

以上是关于SQL Server - 查找缺席日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在SQL Server表查询中查找不同的用户

用于搜索日期的 SQL 查询

Sql Server 查找下一个最近更改的记录

按日期查找记录sql Server

在 SQL Server 中查找非连续日期

动态 SQL Server 查询循环遍历架构查找主键重复