Добрый день!<br/> В документации PostgreSQL 15 указано: <br/> <blockquote>Оконные функции могут использоваться в запросе только в списке SELECT и <b>в предложении ORDER BY.</b></blockquote><br/><br/> Я не нашел примера использования этого правила. Не хотите ли объяснить, как использовать оконные функции в предложении ORDER BY, не путать с использованием ORDER BY внутри определения самой оконной функции, например, over(ORDER BY col)? Нужно что-то вроде: <br/> <pre><code class="sql">SELECT sum(num) OVER w FROM my_table WINDOW w AS (PARTITION BY name) ORDER BY w</code></pre>
Добрый день! Оконные функции в предложении `ORDER BY` могут использоваться для упорядочивания результатов в соответствии с результатами оконной функции. Когда вы используете оконные функции, их можно ссылаться в `ORDER BY` напрямую, что позволяет вам упорядочивать строки на основе вычисленных значений оконных функций. Пример использования оконной функции в `ORDER BY` может выглядеть следующим образом: ```sql SELECT name, num, SUM(num) OVER (PARTITION BY name ORDER BY num) AS running_total FROM my_table ORDER BY running_total; ``` В этом примере мы вычисляем кумулятивную сумму `running_total` для каждой записи, основываясь на значениях, сгруппированных по `name`. Затем мы используем эту `running_total` для упорядочивания выходного результата. Еще один пример, где можно использовать оконную функцию в `ORDER BY`: ```sql SELECT name, num, RANK() OVER (PARTITION BY name ORDER BY num DESC) AS rank FROM my_table ORDER BY rank; ``` В этом случае мы используем `RANK()`, чтобы присвоить ранг каждому значению `num` для каждой группы `name`. Затем мы упорядочиваем результаты по вычисленному рангу. Таким образом, вы действительно можете использовать значения оконных функций в предложении `ORDER BY`, чтобы динамически управлять порядком строк в результирующем наборе данных.
Потому что сортировка происходит по названиям столбцов.
Что ты хочешь получить, указываяORDER BY w
, какая логическая операция должна быть произведена?w
это не скаляр, который можно сравнить, а внутренняя машинерия.
Если хочешь по сумме этой отсортировать, то лучше так (добавить alias):
SELECT sum(num) AS num_sum OVER w FROM my_table WINDOW w AS (PARTITION BY name) ORDER BY num_sum;
Наполовину правильно.
С одной стороны, описание окна расположено в правильном месте - строго после HAVING clause (или того места, где бы оно находилось).
С другой стороны, написан какой-то бред. Что должно означатьORDER BY w
? Сортировка по определению окна? Вы же сами приводите правильную цитату:
Оконные функции разрешается использовать в запросе только в списке SELECT и предложении ORDER BY.
Где же у вас, собственно говоря, функция?
Должно быть, ну, скажем, так:
SELECT sum(num) OVER w FROM my_table WINDOW w AS (PARTITION BY name) ORDER BY MAX(num) OVER w