2013-03-20 115 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 2013-03-20 05:35:45

+1

你能解释一下吗?“如果在前一个结束日期和下一个开始日期之间的间隔超过1分钟,那么应该将其分成单独的组。” – 2013-03-20 06:43:53

回答

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 

什么时我做的是我创建临时表与新列保持下一个开始日期值。然后,我根据开始和结束日期的减去分组值,以分钟计。

我得到了和你的结果一样的行,除了总和。