Поведение PostgreSQL ORDER BY column_label в PARTITION - PullRequest
0 голосов
/ 30 мая 2019

У меня есть 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...