Макрос $accumulateSum
позволяет выполнять аргегирующее суммирование с накоплением (нарастающий итог) для источников PostgreSQL
и ClickHouse
, когда каждая последующая строка включает сумму своей группы и предыдущих. Например, может использоваться для суммирования прибыли по месяцам.
Для PostgreSQL макрос выполняет замену на $over
, который в конечном итоге транслируется в выражение вида sum(valueField) over (oder by sortField rows between unbounded preceding and current row)
.
При использовании $accumulateSum
в запросах к PostgreSQL обязательно добавление в выражение аргумента $orderBy
для определения последовательности строк для суммирования (нарушение порядка будет приводить к неправильному результату).
Всё то же самое можно реализовать без использования макроса, для этого используйте оператор
$sql
, где в качестве выражения заданоsum(${0}) over (oder by ${0} rows between unbounded preceding and current row)
, а также два аргумента (значение для суммирования и поле сортировки).
Пример использования:
Для определения условий формирования групп при расчёте суммы с накоплением используйте дополнительное поле $partitionBy
совместно с #sort
.
В связи с особенностями построения структуры запроса и работы оконных функций в ClickHouse, в некоторых случаях данный макрос (оператор) может приводить к неверным результатам. В таком случае рекомендуется использовать объет "SQL функция" и оператор $sql.
Для ClickHouse макрос выполняет замену на $sql
, который в конечном итоге транслируется в выражение вида runningAccumulate(sumState(valueField))
. Все опциональные аргументы $accumulateSum
при использовании с ClickHouse игнорируются.
При использовании $accumulateSum
в запросах к ClickHouse рекомендуется добавление в запрос условий сортировки $sort
для определения последовательности строк для суммирования (нарушение порядка будет приводить к неправильному результату).
Также при использовании $accumulateSum
в запросах к ClickHouse обязательно необходимо использовать группировку в запросах $groupBy.
Пример использовния: