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|
…