Я ценю, что вы задали этот вопрос очень давно, но он меня заинтересовал, поэтому я провел небольшое исследование и нашел решение Джеффа Модена; он написал статью о группировании островов дат, которые вы можете найти здесь: Группа островов смежных дат (требуется регистрация, но регистрация бесплатна).
Я предположил, что у вас есть таблица со строками для каждого дня в подгруппе, поэтому есть 16 строк для "Tkt1", 18 для "Tkt2" и т. Д. Если это не так, и у вас есть только start и даты окончания каждого «Tkt», вам придется использовать таблицу Calendar
для экстраполяции строк для каждого диапазона.
Решение Джеффа использует трюк ROW_NUMBER
и DATEDIFF
для группировки островов дат.
WITH Grouped_Dates AS
( -- Find the unique dates and assign them to a group.
-- The group looks like a date but the date means nothing except that adjacent
-- dates will be a part of the same group.
SELECT group_name,
unique_date = tkt_date,
date_group = DATEADD(dd, -ROW_NUMBER() OVER (PARTITION BY group_name ORDER BY group_name, tkt_date), tkt_date)
FROM t
GROUP BY group_name, tkt_date
)
-- Now, if we find the MIN and MAX date for each date_group, we'll have the
-- Start and End dates of each group of contiguous daes. While we're at it,
-- we can also figure out how many days are in each range of days.
SELECT group_name,
start_date = MIN(unique_date),
end_date = MAX(unique_date),
days = DATEDIFF(dd,MIN(unique_date),MAX(unique_date))+1
FROM Grouped_Dates
GROUP BY group_name, date_group
ORDER BY group_name, start_date
Результат этого запроса
group_name start_date end_date days
---------- ---------- ---------- ----
Group1 2012-01-01 2012-01-22 22
Group1 2012-01-24 2012-02-03 11
Group2 2012-01-09 2012-01-15 7
Group2 2012-01-18 2012-01-27 10
Я создал SQL Fiddle с примерами данных на основе вашего вопроса.
Затем вы можете суммировать каждую группу, чтобы дать общее время, потраченное.