我有一个名为sample_a
的Postgres 11表,如下所示:
time | cat | val
------+-----+-----
1 | 1 | 5
1 | 2 | 4
2 | 1 | 6
3 | 1 | 9
4 | 3 | 2
我想创建一个查询,该查询针对每个唯一的时间步,获取该时间步或该时间步之前每个类别的最新值,并通过取这些值的总和除以这些值的计数来汇总这些值。
我相信我有查询要在给定的时间范围内执行此操作。例如,对于时间3
,我可以运行以下查询:
select sum(val)::numeric / count(val) as result from (
select distinct on (cat) * from sample_a where time <= 3 order by cat,time desc
) x;
并获得6.5
。 (这是因为在时间3
上,类别1
中的最新值为9
,类别2
中的最新值为4
。值的计数为2
,它们总计为13
,而13
/ 2
为6.5
。)
但是,理想情况下,我希望运行一个查询,该查询将为我提供表中每个唯一时间的所有结果。此新查询的输出如下所示:
time | result
------+----------
1 | 4.5
2 | 5
3 | 6.5
4 | 5
理想情况下,这个新查询将避免添加另一个subselect子句;一个高效的查询将是首选。我可以通过在每个时间步长在应用程序中运行先前的查询来获得这些先前的结果,但是对于大的sample_a
来说,这似乎并不高效。
这个新查询是什么样子?