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的max
和min
日期。
您将使用LAG功能。如果按某种顺序排序,LAG函数会给出之前的值;
完整的描述可以在:http://www.sqlservercentral.com/articles/T-SQL/106783/找到
查看vkp的完整查询答案
如果支持lag
,这是另一种方式。
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 - 查找缺席日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章