首页 > 解决方案 > 每行 SQL 计数连续天数

问题描述

希望获得每行的“总连续天数”。

Shift 表包含 ShiftId、ClientID、ServiceId 和 ProviderID ShiftDetails 表有日期。

可以有多个班次具有相同的 ShiftId、ClientID、ServiceId 甚至可以有重复的日期。

想要进行多个“连续总天数”计算。每个 ClientID 的连续天数 每个 ClientID 和 ServiceID 的连续天数 每个 ClientID 、 ServiceID 和 ProviderID 的连续天数。

SQL小提琴

标签: sqlsql-serverrecursive-querysql-server-2017gaps-and-islands

解决方案


这是一个差距和孤岛问题。您可以通过从日期中减去一系列整数来识别岛屿——恒定的差异识别相邻的日期。然后count(*)用作窗口函数:

select t.*,
       count(*) over (partition by clientid, serviceid, dateadd(day, -seqnum, date)) as consecutive_days
from (select t.*,
             row_number() over (partition by clientid, serviceid order by date) as seqnum
      from t
     ) t

推荐阅读