Sql Postgres中毫秒范围内的下采样时间戳
我有一张如下的桌子Sql Postgres中毫秒范围内的下采样时间戳,sql,postgresql,time-series,psql,downsampling,Sql,Postgresql,Time Series,Psql,Downsampling,我有一张如下的桌子 timestamp v1 v2 v3 2020/01/01 08:10:20.300 10 20 30 2020/01/01 08:10:20.306 11 21 31 2020/01/01 08:10:20.310 12 22 32 2020/01/01 08:10:20.318 13 23 33 2020/01/01 08:10:20.
timestamp v1 v2 v3
2020/01/01 08:10:20.300 10 20 30
2020/01/01 08:10:20.306 11 21 31
2020/01/01 08:10:20.310 12 22 32
2020/01/01 08:10:20.318 13 23 33
2020/01/01 08:10:20.325 14 24 34
.......................
2020/01/01 08:10:21.100 19 29 39
可以看出,时间戳不会在毫秒内均匀变化,并且具有大量的粒度数据。
我感兴趣的是压缩这个表,使时间戳和数据列每100毫秒平均一次,即100毫秒之间的所有数据都得到平均
我有一个解决方案,似乎是工作,但平均是超过每一秒,而不是每100毫秒
SELECT date_trunc('second', timestamp) AS timestamp
,avg(v1) AS avg_v1
,avg(v2) AS avg_v2
,avg(v3) AS avg_v3
FROM myTable
GROUP BY 1;
请告诉我如何解决这个问题。
谢谢请考虑将
时间戳
列转换为时间戳(1)
:这实际上会将其四舍五入到最接近的小数点秒
SELECT
"timestamp"::timestamp(1) AS timestamp,
avg(v1) AS avg_v1,
avg(v2) AS avg_v2,
avg(v3) AS avg_v3
FROM myTable
GROUP BY 1;
请注意,这将舍入时间戳,而不是截断它。通常,08:10:20.306
会变成08:10:20.3
,而08:10:20.350
会变成08:10:20.4
。这可能是,也可能不是你真正想要的
如果你真的想把时间缩短到10秒,那就有点复杂了。一个选项是将时间戳截断为分钟,然后提取第二部分(包括所有小数),将其转换为数字,将其截断为1个小数,然后再将其加回:
SELECT
date_trunc('minute', "timestamp")
+ interval '1 second'
* trunc((extract(seconds from "timestamp"))::numeric, 1) AS timestamp,
avg(v1) AS avg_v1,
avg(v2) AS avg_v2,
avg(v3) AS avg_v3
FROM myTable
GROUP BY 1;
戈登·林诺夫(Gordon Linoff)评论的另一个截断选项是先偏移,然后取整。这比上述解决方案更简单,而且可能更有效:
SELECT
("timestamp" - interval '50 millisecond')::timestamp(1) AS timestamp,
avg(v1) AS avg_v1,
avg(v2) AS avg_v2,
avg(v3) AS avg_v3
FROM myTable
GROUP BY 1;
. . 如果你想把时间缩短到十分之一秒(OP看起来在寻找什么),那么你可以减去50毫秒:
(“timestamp”-interval'50毫秒”)::timestamp(1)
@GordonLinoff:是的,当然,这要简单得多。非常感谢。