【问题标题】:How to get the latest values day wise from a timeseries table?如何从时间序列表中获取每日最新值?
【发布时间】:2021-10-04 00:48:45
【问题描述】:

我想获取每个 SIZE_TYPE 天的最新值,按 TIMESTAMP 排序。因此,对于给定的一天,每个 SIZE_TYPE 只能存在一个值,这是当天的最新值。

如何获得所需的输出?我在这里使用 PostgreSQL。

输入

|TIMESTAMP                               |SIZE_TYPE|SIZE|
|----------------------------------------|---------|----|
|1595833641356 [Mon Jul 27 2020 07:07:21]|0        |541 |
|1595833641356 [Mon Jul 27 2020 07:07:21]|1        |743 |
|1595833641356 [Mon Jul 27 2020 07:07:21]|2        |912 |
|1595876841356 [Mon Jul 27 2020 19:07:21]|1        |714 |
|1595876841356 [Mon Jul 27 2020 19:07:21]|2        |987 |
|1595963241356 [Tue Jul 28 2020 19:07:21]|0        |498 |
|1595920041356 [Tue Jul 28 2020 07:07:21]|2        |974 |
|1595920041356 [Tue Jul 28 2020 07:07:21]|0        |512 |

*Note: the TIMESTAMP values are in UNIX time. I have given
the date-time string for reference*

输出

|TIMESTAMP                               |SIZE_TYPE|SIZE|
|----------------------------------------|---------|----|
|1595833641356 [Mon Jul 27 2020 07:07:21]|0        |541 |
|1595876841356 [Mon Jul 27 2020 19:07:21]|1        |714 |
|1595876841356 [Mon Jul 27 2020 19:07:21]|2        |987 |
|1595920041356 [Tue Jul 28 2020 07:07:21]|2        |974 |
|1595963241356 [Tue Jul 28 2020 19:07:21]|0        |498 |

*Note: the TIMESTAMP values are in UNIX time. I have given
the date-time string for reference*

说明

7 月 27 日的最新值

  • 0:541(当天没有其他条目)
  • 1:714
  • 2:987

7 月 28 日的最新值

  • 0:498
  • 1:无(忽略)
  • 2: 974(当天没有其他条目)

【问题讨论】:

    标签: sql postgresql select time-series


    【解决方案1】:

    你可以使用distinct on:

    select distinct on (floor(timestamp / (24 * 60 * 60 * 1000)), size_type) t.*
    from input
    order by floor(timestamp / (24 * 60 * 60 * 1000)), size_type,
              timestamp desc;
    

    算法只是从时间戳中提取日期。

    Here 是一个 dbfiddle。

    【讨论】:

    • floor 有必要吗?没有floor 会正常工作吗?
    • @SiddiqNx 。 . .如果timestamp 是整数类型,那么 Postgres 会进行整数除法。所以,是的,它可以在没有floor() 的情况下工作。但是,如果 timestampnumeric 则不会。
    • 非常感谢。只是想知道,如果没有distinct on 有没有办法解决这个问题。就像使用子查询或窗口函数一样。
    • @SiddiqNx 。 . .是的。您始终可以在子查询中将 distinct on 替换为 row_number()
    • 很高兴知道。谢谢。我找到了另一种使用内部连接和另一个选择查询并在其中使用 group by 的方法。
    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多