2013-03-20 3 views
2

У меня есть такие данные в SQL ServerДиапазон группирование в месяц

Person StartDate     EndDate     Value 
----------------------------------------------------------------- 
38523 2013-01-10 22:00:00.000 2013-01-10 22:59:00.000 0.064 
38523 2013-01-10 23:00:00.000 2013-01-10 23:59:00.000 0.065 
38523 2013-01-12 00:00:00.000 2013-01-12 00:59:00.000 0.068 
38523 2013-01-12 01:00:00.000 2013-01-12 01:59:00.000 0.069 
38523 2013-01-12 02:00:00.000 2013-01-12 02:59:00.000 0.069 
38523 2013-01-12 03:00:00.000 2013-01-12 03:59:00.000 0.069 
38523 2013-01-31 23:00:00.000 2013-01-31 23:59:00.000 0.061 
38523 2013-02-01 00:00:00.000 2013-02-01 00:59:00.000 0.064 

мне нужно сгруппировать таким образом, что непрерывные значения должны быть сгруппированы вместе в месяц. Если между предыдущей датой окончания и следующей стартовой датой существует промежуток более 1 минуты, то ее следует разделить на отдельную группу.

Ожидаемый результат:

Person StartDate     EndDate     Sum(Value) 
---------------------------------------------------------------------- 
38523 2013-01-10 22:00:00.000 2013-01-10 23:59:00.000 0.129 
38523 2013-01-12 00:00:00.000 2013-01-12 03:59:00.000 0.275 
38523 2013-01-31 23:00:00.000 2013-01-31 23:59:00.000 0.061 (even though continuity exists, month was end hence separate record) 
38523 2013-02-01 00:00:00.000 2013-02-01 00:59:00.000 0.064 

Любая помощь приветствуется.

+2

И что вы уже пробовали? – MarcinJuraszek

+1

не могли бы вы объяснить это: «Если между предыдущей датой окончания и следующей датой начала существует разрыв более 1 минуты, то это должно быть разделено на отдельную группу». –

ответ

0
SELECT 
    CAST(DATEPART(YEAR, DateCreated) as varchar(10)) + '/' 
     + CAST(DATEPART(MONTH, DateCreated) as varchar(10)) 
FROM [Reporting].[dbo].[Hmis_Forms] 
GROUP BY 
    CAST(DATEPART(YEAR, DateCreated) as varchar(10)) + '/' 
     + CAST(DATEPART(MONTH, DateCreated) as varchar(10)) 
0

Только на основе ваших данных и ожидаемого результата, может следующий помощью запроса вы:

SELECT 
    Person, 
    MIN(StartDate) as StartDate, 
    MAX(EndDate) as EndDate, 
    SUM(Value) 
FROM table 
GROUP BY 
    Person, 
    CAST(StartDate as date) 
0

У меня есть что-то подобное, может быть, это может помочь вам:

CREATE TABLE #Test2 
(
    Person int, 
    StartDate datetime, 
    EndDate datetime, 
    Value numeric (12, 3), 
    NextDate datetime 
); 


INSERT INTO #Test2(Person, StartDate, EndDate, Value, NextDate) 
SELECT 
    Person, 
    StartDate, 
    EndDate, 
    Value, 
    (SELECT TOP 1 StartDate FROM Test WHERE StartDate > t.EndDate ORDER BY StartDate, EndDate) 
FROM Test t 



SELECT 
    MAX(StartDate) , 
    MAX(EndDate) , 
    SUM(Value) 


FROM #Test2 
GROUP BY 
    DATEDIFF(MINUTE, NextDate, EndDate) 

ORDER BY 
    MAX(StartDate) , 
    MAX(EndDate)  
DROP TABLE #Test2 

Что я Я сделал то, что я создаю временную таблицу с новым столбцом, которые сохраняют следующее значение начальной даты. Затем я группировал значения на основе вычитания даты начала и окончания, считая в минутах.

Я получаю такую ​​же строку, как и ваши результаты, за исключением суммы.

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