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