Преобразование window

Преобразование window выполняет расчёты по отсортированным группам объектов данных: ранжирование, обращение к предыдущим и следующим значениям, накопленные суммы и средние. Вычисленные значения добавляются к объектам исходного потока.

Пример

Исследуйте, как меняется результат при выборе разных границ окна и агрегирующих функций.

Параметры преобразования

Свойство Тип Описание
sort Compare Описание функции сравнения для сортировки объектов внутри окна. Если два объекта равны по условию сортировки, они считаются равными по рангу. Без sort порядок не определён: объекты обрабатываются по мере поступления, равных по рангу нет, а ignorePeers действует как true.
groupby Field[ ] Поля для разделения объектов на отдельные окна. Если не заданы, все объекты образуют одну группу.
ops String[ ] Оконные и агрегирующие операции, например rank, lead, sum, average или count. См. справочник операций.
fields Field[ ] Поля для расчёта функций. Массив должен соответствовать ops, as и params. Для операций без конкретного поля, например count, rank или dense_rank, значение может быть null.
params Array Параметры оконных функций в порядке массива ops. Для операций без параметра, например агрегирующих, можно указать null.
as String[ ] Имена выходных полей для операций ops. По умолчанию создаются из операции и поля, например rank, sum_field или average_field.
frame Number[ ] Границы скользящего окна в виде массива из двух элементов. Число задаёт смещение от текущего объекта, null — неограниченное число предыдущих или следующих строк. По умолчанию [null, 0]: текущий объект и все предшествующие. [-5, 5] включает по пять объектов до и после текущего; [null, null] — все объекты.
ignorePeers Boolean Игнорировать ли при определении границ окна значения, равные по критерию sort. При false (по умолчанию) окно расширяется до всех таких значений; при true границы задаются только смещениями. Влияет на операции, использующие границы окна: агрегаты, first_value, last_value и nth_value.

Оконные операции

Поддерживаются все агрегирующие операции, а также перечисленные ниже оконные операции.

Операция Параметр Описание
row_number Нет Присваивает каждому объекту последовательный номер строки, начиная с 1.
rank Нет Присваивает ранг начиная с 1. Равные значения получают одинаковый ранг; следующий ранг учитывает их число. Например, после двух значений с рангом 1 третье получает ранг 3.
dense_rank Нет Присваивает плотный ранг начиная с 1. Равные значения получают одинаковый ранг; пропусков в последовательности нет. После двух значений с рангом 1 третье получает ранг 2.
percent_rank Нет Присваивает процентный ранг по формуле (rank - 1) / (group_size - 1).
cume_dist Нет Присваивает значение накопленного распределения от 0 до 1.
ntile Number Распределяет объекты по квантилям, например процентилям. Целочисленный параметр задаёт число групп: 100 для процентилей, 5 для квинтилей.
lag Number Возвращает значение из объекта, расположенного до текущего на заданное число позиций, либо null, если такого объекта нет. Параметр смещения по умолчанию равен 1. Нужно соответствующее поле в массиве fields.
lead Number Возвращает значение из объекта, расположенного после текущего на заданное число позиций, либо null, если такого объекта нет. Параметр смещения по умолчанию равен 1. Нужно соответствующее поле в массиве fields.
first_value Нет Возвращает значение первого объекта текущего скользящего окна. Нужно соответствующее поле в массиве fields.
last_value Нет Возвращает значение последнего объекта текущего скользящего окна. Нужно соответствующее поле в массиве fields.
nth_value Number Возвращает значение объекта на заданной позиции от начала текущего окна либо null, если его нет. Позиции нумеруются с 1; нужен положительный целочисленный параметр и соответствующее поле в массиве fields.
prev_value Нет Если текущее значение поля не равно null или undefined, возвращает его. Иначе берёт ближайшее предыдущее значение, отличное от null и undefined, в отсортированной группе. Работает относительно группы, а не границ окна. Нужно поле в fields. ≥ 5.4
next_value Нет Если текущее значение поля не равно null или undefined, возвращает его. Иначе берёт следующее значение, отличное от null и undefined, в отсортированной группе. Работает относительно группы, а не границ окна. Нужно поле в fields. ≥ 5.4

Использование

Для следующих входных данных:

[
  {"key":0, "value":1},
  {"key":1, "value":3},
  {"key":2, "value":2},
  {"key":2, "value":4},
  {"key":3, "value":3}
]

преобразование window:

{
  "type": "window",
  "sort": {"field": "key", "order": "ascending"},
  "ops": ["rank", "dense_rank", "sum", "mean"],
  "fields": [null, null, "value", "value"],
  "as": ["rank", "drank", "sum", "mean"]
}

дополняет исходный поток результатом:

[
  {"key":0, "value":1, "rank":1, "drank":1, "sum":1, "mean":1},
  {"key":1, "value":3, "rank":2, "drank":2, "sum":4, "mean":2},
  {"key":2, "value":2, "rank":3, "drank":3, "sum":10, "mean":2.5},
  {"key":2, "value":4, "rank":3, "drank":3, "sum":10, "mean":2.5},
  {"key":3, "value":3, "rank":5, "drank":4, "sum":13, "mean":2.6}
]

Заполнение отсутствующих значений

Для следующих входных данных:

[
  {"key":0, "value":1},
  {"key":1, "value":null},
  {"key":2, "value":2},
  {"key":3 },
  {"key":4, "value":3}
]

преобразование window:

{
  "type": "window",
  "sort": {"field": "key", "order": "ascending"},
  "ops": ["prev_value"],
  "fields": ["value"],
  "as": ["value"]
}

возвращает изменённый поток:

[
  {"key":0, "value":1},
  {"key":1, "value":1},
  {"key":2, "value":2},
  {"key":3, "value":2},
  {"key":4, "value":3}
]