按移位的 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 分组的主要内容,如果未能解决你的问题,请参考以下文章

mongoDb 查找文档中的条目数和按字段区分的条目

如何设计 DynamoDB 表以方便按时间范围搜索和按唯一 ID 删除

socket.io 和按对象 id 过滤 mongodb

socket.io 和按对象 id 过滤 mongodb

多循环中的查询和按最后一个查询的 id 排序

具有分组和按日期排序的复杂 sum()