Преобразование 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}
]