按移位的 DATETIME 字段和按 ID 的 PIVOT 分组
Posted
技术标签:
【中文标题】按移位的 DATETIME 字段和按 ID 的 PIVOT 分组【英文标题】:Grouping by shifted DATETIME field and PIVOT by ID 【发布时间】:2021-02-05 05:50:12 【问题描述】:我有带有架构的表(简化):
CREATE TABLE [Test]
(
CaptureTime DATETIME,
SnapShotValue INT,
Id INT
);
使用以下 30 分钟数据:
我想计算每个 HH:00 小时数据的平均值,取值 HH:30 和 HH+1:00 值并将它们旋转。以上测试数据:
我开始 here 并且如何对 HH:00 小时数据进行分组,取值 HH:30 和 HH+1:00 值和 Pivot?谢谢!
【问题讨论】:
【参考方案1】:如果我没看错的话,你可以将捕获时间偏移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)
Demo on DB Fiddle
【讨论】:
v 附近的语法不正确:cross apply (values (datepart(minute, capturetime)) v(captureminute) @amaranth:我的错,缺少右括号。固定。 我得到以下信息: capturetime avg1 avg2 2012-01-01 00:00:00.000 112 120 2012-01-01 01:00:00.000 123 123 2012-01-01 02:00:00.000 126 NULL 我认为我的条件的范围时间不正确 首先,列名不是 ID - 示例中的 1 或 2。其次,对于 ID 1 在时间 2012-01-01 00:00:00.000 的计算平均值,从 2012-01-01 00:30:00.000 获取值是 111 和 2012-01-01 01:00:00.000 是 115 -平均为 (111+115)/2=113 现在平均计算是正确的。但是 ID 号可能不同,我不能在 SELECT 中写下每个 ID。第二如何通过 ID 获取列名?以上是关于按移位的 DATETIME 字段和按 ID 的 PIVOT 分组的主要内容,如果未能解决你的问题,请参考以下文章