#sql #snowflake-cloud-data-platform
#sql #snowflake-cloud-data-platform
Вопрос:
Мне нужно рассчитать общее время из разных полей и строк, но мне нужно исключить несколько раз из расчета. Пример легче понять. Я хочу для каждой строки вычислить order1_time_1 payment_time_1 payment_time_2 checkout_time_2 (если у order2 есть time_1 = 0 или time_2 = 0). Иногда существует несколько событий заказа, но только одно будет иметь значения в time_1 и time_2. Я надеюсь, что это имеет смысл. Любое предложение приветствуется. Я думаю, что это можно решить с помощью оконных функций, но я просто не могу понять это правильно.
Мои данные (total_time показывает вычисление, но требуется только результат):
id, Datetime, Event name, time_1, time_2, total_time (new field)
123, 2020-02-01 12:12, Order1, 30, 40, 30 20 50 40=140
123, 2020-02-01 12:12, Order2, 0, 0, 30 20 50 40=140
123, 2020-02-01 12:12, Payment, 20, 50, 30 20 50 40=140
123, 2020-02-01 12:12, CheckOut, 60, 40, 30 20 50 40=140
234, 2020-02-01 12:13, Order1, 0, 0, 300 20 50 50=420
234, 2020-02-01 12:13, Order2, 300, 400, 300 20 50 50=420
234, 2020-02-01 12:13, Payment, 20, 50, 300 20 50 50=420
234, 2020-02-01 12:13, CheckOut, 60, 50, 300 20 50 50=420
345, 2020-02-01 12:14, Order1, 30, 40, 30 20 50 50=150
345, 2020-02-01 12:14, Payment, 20, 50, 30 20 50 50=150
345, 2020-02-01 12:14, CheckOut, 60, 50, 30 20 50 50=150
Ответ №1:
Вы хотите a sum()
с условной логикой:
select t.*,
sum(case when event_name in ('Order1', 'Payment') then time_1
when event_name in ('Order2', 'CheckOut') then time_2
end) over (partition by id) as total_time
from t;
Комментарии:
1. Спасибо. Я на самом деле решил это с помощью case и функции window после того, как опубликовал свой вопрос 🙂 Спасибо!