Кросс-строчные функции
Кросс-строчные функции — «оконные»: возвращают значение, которое зависит от позиции текущей строки в таблице и от соседних строк.
Важно. Порядок строк = тот порядок, в котором они отображены в таблице (или поданы на виджет). Если хотите «накопительную сумму по дате» — сначала отсортируйте по дате.
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, ранжирование по ним бессмысленно. Ранжируйте по числовому полю.