Доступные версии документации

WITHIN GROUP-спецификация

Функция

Задает порядок группировки записей при обработке агрегатных функций.

Спецификация

   
<WITHIN GROUP-спецификация>::=

Синтаксические правила

  1. Использование <WITHIN GROUP-спецификации> совместно с <OVER-спецификацией> недопустимо.

  2. <WITHIN GROUP-спецификация> может применяться как при наличии, так и при отсутствии в <запросе выборки> <GROUP BY-спецификации>.

  3. Количество <WITHIN GROUP-спецификаций> в <запросе выборки> не ограничено, однако при наличии в <запросе выборки> <GROUP BY-спецификации> все <ORDER BY-спецификация> внутри <WITHIN GROUP-спецификации> должны быть идентичны.

    Допустимый запрос (конструкции within group (order by model) одинаковы у обеих агрегатных функций):
    
    select bodytype,
    FIRST_VALUE(model) within group (order by model) as first_val,
    LAST_VALUE(model) within group (order by model) as last_val from auto group by bodytype;
        Недопустимые запросы (конструкции within group не идентичны):
        а)
    select bodytype,
    FIRST_VALUE(model) within group (order by model) as first_val,
    LAST_VALUE(model) within group (order by color) as last_val from auto group by
    bodytype;
        б)
    select FIRST_VALUE(make) within group (order by make asc) as first_val,
    LAST_VALUE(make) within group (order by make desc) as last_val
    from auto group by make;

Общие правила

  1. При наличии в запросе <GROUP BY-спецификации> сортировка записей в соответствии с конструкцией <WITHIN GROUP-спецификация> будет осуществляться отдельно внутри каждой группы.

  2. При отсутствии в запросе <GROUP BY-спецификации> сортироваться будут все записи выборки.

  3. Порядок сортировки аргументов важен только для агрегатных функций (FIRST_VALUE, LAST_VALUE, LISTAGG), результат которых зависит от заданной сортировки. Для агрегатных функций, возвращающих количественные значения (SUM, COUNT и др.), порядок сортировки не имеет значения, поэтому для них конструкция <WITHIN GROUP-спецификация> игнорируется.

select count(*),
FIRST_VALUE(model) within group (order by year, model, color) as first_val,
LAST_VALUE(model) within group (order by year, model, color) as last_val
from auto group by make;

             FIRST_VAL            LAST_VAL
             ---------            --------
|          7|A-310               |A-310               |
|         91|AMBASSADOR SST V8   |MATADOR STATION     |
|         10|3.0 CSI             |3.0 CSI             |
|        168|DODGE CHALLENGER SIX|PLYMOUTH ROAD RUNNER|
…
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter