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