首页 > 解决方案 > 使用窗口函数?

问题描述

我需要计算不同字段和行的总时间,但我需要从计算中排除一些时间。一个例子更容易理解。我想为每一行计算 order1_time_1+payment_time_1+payment_time_2+checkout_time_2(如果 order2 有 time_1=0 或 time_2=0)。有时有多个订单事件,但只有一个在 time_1 和 time_2 中有值。我希望这是有道理的。任何建议表示赞赏。我认为这可以通过窗口函数来解决,但我就是做错了。

我的数据(显示计算的总时间,但只需要结果):

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

标签: sqlsnowflake-cloud-data-platform

解决方案


You want a sum() with conditional logic:

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;

推荐阅读