我必须创建一个视图(SQL Server 2016),其中我有相同ID的连续班次小时数。
班次只能等于1或2或3;它们按此顺序排列:1-> 2-> 3。在第3班之后,下一天是第二天的第1班。
连续班次是指您有相同的日期和连续数字(1> 2,2-> 3,1-> 2> 3),但是当您有连续的日期并从3至1(3-> 1)。
所以我有这样的事情:
╔════╦════════════╦═════════════╦═════════════╗
║ ID ║ Date ║ Shift ║ Lenght ║
╠════╬════════════╬═════════════╬═════════════╣
║ 101║ 2018-05-19 ║ 2 ║ 4 ║
║ 101║ 2018-05-19 ║ 3 ║ 16 ║
║ 101║ 2018-05-20 ║ 1 ║ 16 ║
║ 101║ 2018-05-20 ║ 3 ║ 14 ║
║ 202║ 2018-05-20 ║ 1 ║ 8 ║
╚════╩════════════╩═════════════╩═════════════╝
我想得到类似的东西(我不再需要轮班):
╔════╦════════════╦═════════════╗
║ ID ║ Date ║ Lenght ║
╠════╬════════════╬═════════════╣
║ 101║ 2018-05-19 ║ 36 (4+16+16)║
║ 101║ 2018-05-20 ║ 14 ║
║ 202║ 2018-05-20 ║ 8 ║
╚════╩════════════╩═════════════╝
有人能帮助我吗?感谢
答案 0 :(得分:2)
这是间隙和岛屿的变种。我建议使用row_number()
,但这很棘手,因为你必须衡量 shift 的差异。
所以:
select id, min(date), sum(length)
from (select s.*,
(datediff(day, '2000-01-01', date) * 3 + shift - 1) as shift_counter,
row_number() over (partition by id order by date, shift) as seqnum
from shifts s
) s
group by id, (shift_counter - seqnum)
order by id, min(date);
这是rextester显示它正常工作。
答案 1 :(得分:0)
select ID,Date,SUM(Lenght) OVER (partition by id ORDER BY id ROWS UNBOUNDED
PRECEDING)
from shifts
order by id,date