Перейти к содержимому

Кросс-строчные функции

Кросс-строчные функции — «оконные»: возвращают значение, которое зависит от позиции текущей строки в таблице и от соседних строк.

Важно. Порядок строк = тот порядок, в котором они отображены в таблице (или поданы на виджет). Если хотите «накопительную сумму по дате» — сначала отсортируйте по дате.

running_sum(expr)

Накопительная сумма с начала до текущей строки включительно.

running_sum(amount)
running_sum(if(type == "income", amount, -amount))

Пример. Лента транзакций отсортирована по дате. running_sum(amount) в каждой строке — общий баланс на момент этой строки.

lag(expr, n=1)

Значение expr из строки на N назад. Если позиция за пределами — null.

lag(close_price) // цена закрытия предыдущей строки
lag(amount, 3) // три строки назад

lead(expr, n=1)

Аналогично, но вперёд.

lead(payment_date) // дата следующего платежа

window_avg(expr, n)

Скользящее среднее за последние n строк (включая текущую).

window_avg(amount, 3) // среднее за текущую и две предыдущих
window_avg(amount, 12) // 12-месячное MA

Возвращает null, если n ≤ 0 или все значения окна пусты.

rank(expr)

1-based «dense rank» по убыванию: строка с наибольшим значением — 1. Ничьих в текущей реализации может быть несколько с одинаковым рангом — null пропускаются в подсчёте.

rank(annual_return) // ранг актива по доходности
rank(monthly_rent) // ранг квартиры по аренде

Граничные случаи

  • Нет контекста датасета (формула вызвана вне таблицы) → ошибка «needs an ordered dataset and a current-row index».
  • Дата не отсортированаrunning_sum, lag, lead дадут странный результат. Это поведение, а не баг.
  • n больше, чем строк перед текущейlag вернёт null.

Когда running_sum vs sum

  • sum(amount) — одна цифра по всему датасету (агрегат).
  • running_sum(amount) — накопительная цифра в каждой строке.

В виджете KPI вы используете sum. В колонке таблицы или в линейном графике, где видно динамику накопления — running_sum.

Частые ошибки

  • Ожидают lag по дате, но строки отсортированы по id. Сначала сортируйте — иначе lag(price) возьмёт «предыдущую по id», а не «предыдущую по времени».
  • window_avg(amount, 30) на месячных данных. Это даст «среднее за 30 месяцев». Если хотели за 30 дней — нужно подать дневные строки.
  • rank со связями. Связи — это id, ранжирование по ним бессмысленно. Ранжируйте по числовому полю.

Что дальше