1

我有一些数据要分析,其粒度为半小时,但想按 2、3、6、12 小时和 2 天 1 周对其进行分组,以进行更有意义的比较。

|DateTime | Value |
|01 Jan 2013 00:00 | 1 |
|01 Jan 2013 00:30 | 1 |
|01 Jan 2013 01:00 | 1 |
|01 Jan 2013 01:30 | 1 |
|01 Jan 2013 02:00 | 2 |
|01 Jan 2013 02:30 | 2 |
|01 Jan 2013 03:00 | 2 |
|01 Jan 2013 03:30 | 2 |

例如。2小时分组结果将是

|DateTime | Value |
|01 Jan 2013 00:00 | 4 |
|01 Jan 2013 02:00 | 8 |

为了获得 2 小时分组的结果,我想到了这段代码 -

CASE
WHEN DatePart(HOUR,DateTime)%2 = 0 THEN
    CAST(CAST(DatePart(HOUR,DateTime) AS varchar) + '':00'' AS TIME)
ELSE
    CAST(CAST(DATEPART(HOUR,DateTime) As Int) - 1 AS varchar) + '':00'' END Time        

这似乎工作正常,但我想不出用它来概括为 3、6、12 小时。我可以在 6、12 小时内只使用案例陈述并取得结果,但是有什么方法可以概括,以便我可以达到 2、3、6、12 小时的粒度以及 2 天和一周的粒度?通过概括,我的意思是我可以将具有所需粒度的变量传递给同一个查询,而不必用不同的 case 语句构成不同的查询。

这可能吗?请提供一些指示。

非常感谢!

4

1 回答 1

1

我认为你可以使用

Declare @Resolution int = 3 -- resolution in hours

Select
    DateAdd(Hour, 
        DateDiff(Hour, 0, datetime) / @Resolution * @Resolution, -- integer arithmetic
        0) as bucket,
    Sum(values)
From
    table
Group By
    DateAdd(Hour, 
        DateDiff(Hour, 0, datetime) / @Resolution * @Resolution, -- integer arithmetic
        0)
Order By
    bucket

这会计算自已知固定日期以来的小时数,四舍五入到您感兴趣的分辨率大小,然后将它们添加回固定日期。

它会错过桶,但如果你没有数据

Example Fiddle

于 2013-09-22T21:30:46.973 回答