sql - 使用窗口函数?
问题描述
我需要计算不同字段和行的总时间,但我需要从计算中排除一些时间。一个例子更容易理解。我想为每一行计算 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
解决方案
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;
推荐阅读
- google-app-maker - 在 Google AppMaker 中对表格进行排序
- rest - 微服务之间的通信——请求数据
- codeigniter - $this->db->replace() 使用 where
- javascript - jQuery 延迟对象上的 setInterval
- angular - Angular 6 升级不执行测试
- reactjs - redux-observable Promise 在单元测试中没有得到解决
- c++ - 矢量和原始 c 样式数组之间的性能比较
- swift - 在 Uitableviewcontroller 内创建水平可滚动区域
- neo4j - 在 Neo4j 中编写查询以查找节点之间的特定关系
- python-3.x - 在python中对加权无向图进行排序