2016-09-05 3 views
0

У меня есть таблица SQL Server 2012, в которой хранится, активен ли клиент для определенной недели. Я хочу вывести результаты, которые показывают мне, сколько недель подряд был активен клиент вместе с начальной и конечной неделей. У меня есть код ниже, но это дает мне общее количество недель, когда клиент был активным. Можно ли последовательно разбивать счетчики? Любая помощь приветствуется.SQL Server Count Последовательные точки останова

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

enter image description here

ответ

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(), вы поймете, почему разница определяет группы, которые вы ищете.

Смежные вопросы