SQL Server计数顺序断点

时间:2016-09-05 21:19:53

标签: sql sql-server

我有一个SQL Server 2012表,用于存储客户在特定周内是否处于活动状态。我想输出一个结果,显示客户连续几周以及开始周和结束周。我有以下代码,但这只给了我一个客户活跃的总周数。是否有可能按顺序打破计数?任何帮助表示赞赏。

SELECT
    ActiveYN
    ,MIN(StartWeek)
    ,MAX(StartWeek)
    ,COUNT(*)
FROM TableA
GROUP BY ActiveYN

enter image description here

1 个答案:

答案 0 :(得分:1)

这称为间隙和岛屿问题。一种解决方案使用行号的差异:

select customer, activeyn,
       min(startweek), max(startweek)
from (select t.*,
             (row_number() over (partition by customer order by startweek) -
              row_number() over (partition by customer, activeyn order by startweek)
             ) as grp
      from tablea t
     ) t
group by customer, activeyn, grp;

计算看起来有点像魔法咒语。但是,如果您运行子查询并查看每个row_number()计算的结果,您就会明白为什么差异定义了您要查找的组。