payout is_upsell
ccc991c1-5dcf-41ca-801c-f9f519761c25 8 0
ccc991c1-5dcf-41ca-801c-f9f519761c25 10 1
ccc991c1-5dcf-41ca-801c-f9f519761c25 8 0
ccc991c1-5dcf-41ca-801c-f9f519761c25 10 0
ccc991c1-5dcf-41ca-801c-f9f519761c25 12 1
Как можно посчитать сумму с условиями
Поясню, логика работы, если последнее значение is_upsell = 1, тогда смотрим предыдущее значение, если значение is_upsell = 1, смотрим еще предыдущее, если оно 0, тогда суммируем payout значения
Из примера выше в итоге хочется видеть конечный результат:
ccc991c1-5dcf-41ca-801c-f9f519761c25 22
Может кто скажет в какую сторону копать или смотреть в доку?
sumIf(выражение, выражение для проверки условия https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/combinators/
А разве можно в sumIf множественные кондишены писать и еще в зависимости от предыдущего значения? Если переводить на какой нибудь ЯП, это была бы функция в которую приходит коллекцию, коллекцию перебираешь с конца и проверяешь каждый элемент и суммируешь
Что-то типа такого: type Item = { is_upsell: boolean; payout: number; } function sum(items: Item[]): number { let sum = 0; for (const item of items.reverse()) { if(!item.is_upsell) { return sum + item.payout; } sum += item.payout; } return sum; }
кондишены то можно писать, а вот предыдущее значение наверное только через window functions можно было бы попробовать сделать, но их еще не запилили
Обсуждают сегодня