如何在 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 每个时间戳桶和每个单元的较早记录。
我不明白这个问题与 平均值 有什么关系。
我在 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 每个时间戳桶和每个单元的较早记录。
我不明白这个问题与 平均值 有什么关系。