Как применить оконные функции в предложении Order By?

Добрый день!<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>
  • 15 декабря 2024 г. 9:13
Ответы на вопрос 3
Добрый день! Оконные функции в предложении `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
Похожие вопросы