连续转弯的总时数

时间:2018-06-14 10:50:13

标签: sql sql-server

我必须创建一个视图(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       ║    
╚════╩════════════╩═════════════╝

有人能帮助我吗?感谢

2 个答案:

答案 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