Использование оконной функции?

#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 после того, как опубликовал свой вопрос 🙂 Спасибо!