我有一个SQL Server 2012表,用于存储客户在特定周内是否处于活动状态。我想输出一个结果,显示客户连续几周以及开始周和结束周。我有以下代码,但这只给了我一个客户活跃的总周数。是否有可能按顺序打破计数?任何帮助表示赞赏。
SELECT
ActiveYN
,MIN(StartWeek)
,MAX(StartWeek)
,COUNT(*)
FROM TableA
GROUP BY ActiveYN
答案 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()
计算的结果,您就会明白为什么差异定义了您要查找的组。