У меня есть таблица Postgres 11 с именем sample_a
, которая выглядит следующим образом:
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
В идеале этот новый запрос должен избегать добавления еще одного предложения подвыбора, если это возможно;эффективный запрос будет предпочтительным. Я мог бы получить эти предыдущие результаты, выполнив предыдущий запрос внутри моего приложения для каждого временного шага, но это не кажется эффективным для большого sample_a
.
Как будет выглядеть этот новый запрос?