如何在 Postgres 的时间范围内获取平均值?

How to get an average value in a timescale in Postgres?

我在 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 分钟的平均值计算,这应该 return 包含平均值的最早记录。

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

returned 数据应该如下所示:

[
{
  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"
},
]

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

谢谢

您可以使用 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 开始发挥作用,select 每个时间戳桶和每个单元的较早记录。

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