【问题标题】:Downsample Timestamp in milisecond range in PostgresPostgres中以毫秒为单位的下采样时间戳
【发布时间】:2020-09-03 15:49:03
【问题描述】:

我有一张如下表

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;

请指导我如何解决此问题。 谢谢

【问题讨论】:

    标签: sql postgresql time-series psql downsampling


    【解决方案1】:

    考虑将timestamp 列转换为timestamp(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 millisecond')::timestamp(1)
    • @GordonLinoff:是的,当然,这要简单得多。非常感谢。
    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2015-06-17
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多