【问题标题】:How to get an average value in a timescale in Postgres?如何在 Postgres 的时间范围内获得平均值?
【发布时间】:2021-03-27 15:23:58
【问题描述】:

我在 postgres 数据库中有很多包含时间值的值。

数据库包含一个记录单元颜色,类似这样:

[
{
  id: 1234,
  unit: 2,
  color: "red",
  time: "Wed, 16 Dec 2020 21:45:30"
},
{
  id: 1235,
  unit: 2,
  color: "red",
  time: "Wed, 16 Dec 2020 21:47:30"
},{
  id: 1236,
  unit: 6,
  color: "blue",
  time: "Wed, 16 Dec 2020 21:48:30"
},
{
  id: 1237,
  unit: 6,
  color: "green",
  time: "Wed, 16 Dec 2020 21:49:30"
},
{
  id: 1237,
  unit: 6,
  color: "blue",
  time: "Wed, 16 Dec 2020 21:49:37"
},
]

我希望能够以 10 分钟的平均值查询此列表,这应该返回包含平均值的最早记录。

例如,在 21:40 - 21:50 的 10 分钟内,我应该只收到 2 个具有该时间段内平均值的唯一单位。

返回的数据应该是这样的:

[
{
  id: 1234,
  unit: 2,
  color: "red",
  time: "Wed, 16 Dec 2020 21:45:30"
},
{
  id: 1236,
  unit: 6,
  color: "blue",
  time: "Wed, 16 Dec 2020 21:48:30"
},
]

我应该使用什么类型的查询来实现这样的目标?

谢谢

【问题讨论】:

    标签: sql postgresql datetime greatest-n-per-group date-arithmetic


    【解决方案1】:

    你可以使用distinct on:

    select distinct on (x.time_trunc, t.unit) t.*
    from mytable t
    cross join lateral (values (
        date_trunc('hour', time) 
            + extract(minute from time) / 10 * '10 minute'::interval)
    ) as x(time_trunc)
    order by x.time_trunc, t.unit, t.time 
    

    诀窍是将时间戳截断为 10 分钟。为此,我们使用日期算术;我在横向连接中移动了计算,因此无需重复表达式。然后,distinct on 发挥作用,为每个时间戳桶和每个单元选择较早的记录。

    我看不出这个问题与平均值有什么关系。

    【讨论】:

    • 当我使用这个语句时,分组似乎每分钟发生一次,而不是每 10 分钟一次。
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2018-10-20
    • 2022-12-22
    相关资源
    最近更新 更多