[英]Counting Consecutive days SQL Server
我希望為每個人計算連續的一天咒語。
我的桌子:
CREATE TABLE Absence(
Date Date,
Code varchar(10),
Name varchar(10),
Type varchar(10)
);
INSERT INTO Absence (Date, Code, Name, Type)
VALUES ('01-10-18', 'S', 'Sam', 'Sick'),
('01-11-18','S', 'Sam', 'Sick'),
('01-12-18','S', 'Sam', 'Sick'),
('01-21-18','S', 'Sam', 'Sick'),
('01-26-18','S', 'Sam', 'Sick'),
('01-27-18','S', 'Sam', 'Sick'),
('02-12-18','S', 'Sam', 'Holiday'),
('02-13-18','S', 'Sam', 'Holiday'),
('02-18-18','S', 'Sam', 'Holiday'),
('02-25-18','S', 'Sam', 'Holiday'),
('02-10-18','S', 'Sam', 'Holiday'),
('02-13-18','F', 'Fred', 'Sick'),
('02-14-18','F', 'Fred', 'Sick'),
('02-17-18','F', 'Fred', 'Sick'),
('02-25-18','F', 'Fred', 'Sick'),
('02-28-18','F', 'Fred', 'Sick');
這是我目前擁有的代碼:
WITH CTE AS
(
SELECT
Date,
Name,
Type
,GroupingSet = DATEADD(DAY, ROW_NUMBER() OVER
(PARTITION BY [Name], [Type] ORDER BY [Date]), [Date])
FROM Absence
)
SELECT
Name,
StartDate = MIN(Date),
EndDate = MAX(Date),
Result = COUNT(Name),
min(Type) AS [Type]
FROM CTE
GROUP BY Name, GroupingSet
-- HAVING COUNT(NULLIF(Code, 0)) > 1
ORDER BY Name, StartDate
產生結果:
| Name | StartDate | EndDate | Result | Type |
|------|------------|------------|--------|---------|
| Fred | 2018-02-13 | 2018-02-13 | 1 | Sick |
| Fred | 2018-02-14 | 2018-02-14 | 1 | Sick |
| Fred | 2018-02-17 | 2018-02-17 | 1 | Sick |
| Fred | 2018-02-25 | 2018-02-25 | 1 | Sick |
| Fred | 2018-02-26 | 2018-02-28 | 1 | Sick |
| Sam | 2018-01-10 | 2018-01-10 | 1 | Sick |
| Sam | 2018-01-11 | 2018-01-11 | 1 | Sick |
| Sam | 2018-01-12 | 2018-01-12 | 1 | Sick |
| Sam | 2018-01-21 | 2018-01-21 | 1 | Sick |
| Sam | 2018-01-26 | 2018-01-26 | 1 | Sick |
| Sam | 2018-01-27 | 2018-01-27 | 1 | Sick |
| Sam | 2018-02-10 | 2018-02-10 | 1 | Holiday |
| Sam | 2018-02-12 | 2018-02-12 | 1 | Holiday |
| Sam | 2018-02-13 | 2018-02-13 | 1 | Holiday |
| Sam | 2018-02-18 | 2018-02-18 | 1 | Holiday |
| Sam | 2018-02-25 | 2018-02-25 | 1 | Holiday |
在我正在尋找這樣的結果集的地方:
| Name | Date | Result | Type |
|------|------------|---------|---------|
| Fred | 2018-02-13 | 2 | Sick |
| Sam | 2018-01-27 | 2 | Sick |
| Sam | 2018-02-10 | 1 | Holiday |
我需要計算連續1天以上的連續天數。 然后將其作為某人擁有多少個連續咒語的總和。 例如,弗雷德在這段時間內連續2次生病。 如果某人有星期五和星期一休息,我也需要此內容,這應該算作連續咒語。
我對如何到達那里有些迷失。 任何幫助將不勝感激。
請參閱: http ://sqlfiddle.com/#!18/88612/16
您可以使用以下方式獲取缺勤時間:
select name, min(date), max(date), count(*) as numdays, type
from (select a.*,
row_number() over (partition by name, type order by date) as seqnum_ct
from absence a
) a
group by name, type, dateadd(day, -seqnum_ct, date);
這是一個SQL Fiddle。
您可以添加having count(*) > 1
以獲取一天或更長的期限。 這似乎很有用。 我不明白最終的輸出是什么。 該描述對我而言毫無意義。
如果您希望缺勤的天數為2天或以上,則可以將其用作子查詢/ CTE:
select name, count(*), type
from (select name, min(date) as mindate, max(date) as maxdate, count(*) as numdays, type
from (select a.*,
row_number() over (partition by name, type order by date) as seqnum_ct
from absence a
) a
group by name, type, dateadd(day, -seqnum_ct, date)
) b
where numdays > 1
group by name, type;
嘗試這個:
select name, min([date]) [date], count(*) [result], [type] from (
select *, SUM(isConsecutive) over (partition by name,[type] order by [date] rows between unbounded preceding and current row) [isConsecutiiveId]
from (
select *, case when dateadd(day, -1, [date]) = LAG([date]) over (partition by name,[type] order by [date]) then 0 else 1 end [isConsecutive] from #Absence
) a
) a group by name,[type],isConsecutiiveId
它導致的缺勤期比您的預期結果長,因為在您的數據中有更多的缺勤期。 它顯然包括您的結果,但還有更多:)
SELECT
s.[Name], 'Last 12 Months' as [Date], s.[Type], COUNT(s.[numdays]) AS
[Consecutive Spells]
FROM ( select name, min(date) AS [Date], max(date) AS [Date2],
count(*) as numdays, type
from (select a.*, row_number() over (partition by name, type order by date)
as seqnum_ct
from absence a
) a
group by name, type, dateadd(day, -seqnum_ct, date)
HAVING count(*) > 1
)S
GROUP BY s.[Name], s.[Type]
這是我一直在尋找的結果。 -http://sqlfiddle.com/#!18/472d2/23
但是,感謝您對戈登的幫助,它使我朝着正確的方向前進!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.