У меня есть SQL-запрос, который использует оконную функцию PostgreSQL, которая выглядит примерно так:
SELECT
tags.id,
tags.title,
to_timestamp(posts.published_date) at time zone 'utc' at time zone '+08:00'::date,
COUNT(1),
SUM(COUNT(1)) OVER (PARTITION BY tags.id ORDER BY to_timestamp(posts.published_date) at time zone 'utc' at time zone '+08:00'::date ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)\
FROM posts
INNER JOIN post_tag ON post_tag.post_id = posts.id
INNER JOIN tags ON post_tag.tag_id = tags.id
GROUP BY 1,2,3
Как правило, он возвращает для каждого Tag
, сколько сообщений помечено для него сгруппировано по дням (день - это 3-й столбец, а в 4-м столбце показано количество). Самое сложное - это пятый столбец, в котором отображается сумма всех сообщений до даты самой строки, например строки ниже:
1 Entertainment 2019-5-30 5 20
будет означать, что для Tag
с идентификатором 1
и именем Entertainment
на 30 мая будет в общей сложности 5 сообщений и всего 20 сообщений за все время , за исключением 30 мая.
Теперь это работает хорошо, как задумано, но в идеале я бы предпочел сократить многословие, заменив to_timestamp(posts.published_date) at time zone 'utc' at time zone '+08:00'::date
в предложении OVER
, чтобы использовать упорядочение столбцов. Обратите внимание, что я уже использую упорядочение букв столбцов в моем GROUP BY
, но когда я делаю ORDER BY 3
в предложении OVER
, это дает мне совершенно неверный результат.
Наверное, мой вопрос: как ORDER BY *column ordering*
работает в предложении OVER
?