【发布时间】:2018-10-20 01:25:57
【问题描述】:
我使用的是 PostgreSQL 9.6。我有一张这样的桌子:
mac sn loc time date vin1 vin2 vin3
1a34 4as11111111 aaaa 7:06:18 1/1/2018 447.42 472.32 682.59
1a34 4as11111111 aaaa 7:06:43 1/1/2018 455.97 476.25 682.59
1a34 4as11111111 aaaa 7:07:35 1/1/2018 470.88 484.2 682.5
我需要在 300 秒(5 分钟)的时间间隔内计算 vin1、vin2、vin3 的平均值。例如,对于范围内的日期,从第一次 (7:06:18 - 7:11:18) 开始。我可以通过这个查询选择我需要的数据:
select * from table
where sn='4as11111111' and date between '2018-01-01' and '2018-01-02';
但我不知道如何按 300 秒的时间间隔对其进行分组,并计算这 5 分钟间隔的 vin1、vin2、vin3 列的平均值,以获得如下结果:
mac sn loc time date vin1_av vin2_av vin3_av
1a34 4as11111111 aaaa 7:06:18 1/1/2018 450.0 480.32 600.59
1a34 4as11111111 aaaa 7:11:18 1/1/2018 460.0 490.25 782.59
1a34 4as11111111 aaaa 7:16:18 1/1/2018 470.88 500.2 600.5
任何帮助将不胜感激。
【问题讨论】:
-
没有任何现有行的时间间隔怎么办?包括结果
0或NULL或根本没有行?范围可以超过一天吗?此外,您的示例数据和结果不匹配。查询也没有(不同的日期)。 -
所有行都保证有数据,可能有0.0V但不能为NULL。可能有没有数据的时隙,你是对的,所以这些时隙应该被忽略。跨度可以是几周、几个月。抱歉查询日期(我已修复),它们与我想要的结果不匹配,我只是复制了一个实验查询作为示例
-
谢谢欧文。我的真实表有第一列“mac”(请参阅编辑后的问题,对不起,我没有将它包含在原始帖子中,认为这并不重要),并且它更改了查询,因此我无法使其工作使用您的解决方案。我觉得它是正确的,但仍然无法弄清楚变化。
-
看起来
mac和loc对于同一个sn总是相同的。是这样吗?如果不是,那将如何反映预期的结果?我根据有根据的猜测更新了解决方案。 -
@Erwin:不,mac 和 loc 可能不同,但这并不重要,因为我最感兴趣的是 sn 选择。很奇怪,我在 dbfiddle (dbfiddle.uk/…) 上使用了您的查询,它与示例数据完美配合,但是当我用真实数据尝试它时(就像现在在 dbfiddle 中一样),“没有返回行”(参见 dbfiddle关联)。在我的本地数据库上,我得到这个“错误:在目标列表中找不到 ORDER/GROUP BY 表达式”。所以,我又错过了一些简单的东西。
标签: sql postgresql group-by average generate-series