Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres中毫秒范围内的下采样时间戳_Sql_Postgresql_Time Series_Psql_Downsampling - Fatal编程技术网

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:是的,当然,这要简单得多。非常感谢。