Sql server 按移位日期时间字段分组,按ID透视

Sql server 按移位日期时间字段分组,按ID透视,sql-server,datetime,sql-server-2008,pivot,aggregate-functions,Sql Server,Datetime,Sql Server 2008,Pivot,Aggregate Functions,我有一个带有模式(简化)的表: 使用以下30分钟数据: 我要计算每个小时的平均值,数据取HH:30和HH+1:00的值,然后旋转它们。对于上述测试数据: 我开始和如何分组值HH:00小时数据获取值HH:30和HH+1:00值和轴?谢谢大家! 如果我没有弄错,您可以将捕获时间偏移30分钟,然后删除这些分钟,最后执行条件聚合: select dateadd(minute, - datepart(minute, v.capturetime), v.capturetime) capture_time

我有一个带有模式(简化)的表:

使用以下30分钟数据:

我要计算每个小时的平均值,数据取HH:30和HH+1:00的值,然后旋转它们。对于上述测试数据:


我开始和如何分组值HH:00小时数据获取值HH:30和HH+1:00值和轴?谢谢大家!

如果我没有弄错,您可以将捕获时间偏移30分钟,然后删除这些分钟,最后执行条件聚合:

select dateadd(minute, - datepart(minute, v.capturetime), v.capturetime) capture_time,
    avg(case when id = 1 then 1.0 * snapshotvalue end) avg1,
    avg(case when id = 2 then 1.0 * snapshotvalue end) avg2
from test t
cross apply (values (dateadd(minute, - 30, capturetime))) v(capturetime)
group by dateadd(minute, - datepart(minute, v.capturetime), v.capturetime) 

v附近的语法不正确:交叉应用(值(datepart(分钟,capturetime))v(captureminute)@amaranth:我的错,缺少一个右括号。修复。我得到以下结果:capturetime avg1 avg2 2012-01-01 00:00.000 112 120 2012-01-01-01 01:00.000 123 2012-01-01-01 02:00:00.000 126 NULL我认为我的条件的范围时间不正确在第一个示例中,列名不是ID-1或2。在第二个示例中,对于ID为1的calc avg时间2012-01-01 00:00:00.000从2012-01-01 00:30:00.000中获取值是111,2012-01-01:00:00.000是115-平均值将是(111+115)/2=113现在平均值计算是正确的。但是ID号可能不同,我无法在SELECT中写入每个ID。其次,如何通过ID获取列名?
select dateadd(minute, - datepart(minute, v.capturetime), v.capturetime) capture_time,
    avg(case when id = 1 then 1.0 * snapshotvalue end) avg1,
    avg(case when id = 2 then 1.0 * snapshotvalue end) avg2
from test t
cross apply (values (dateadd(minute, - 30, capturetime))) v(capturetime)
group by dateadd(minute, - datepart(minute, v.capturetime), v.capturetime)