我正在尝试计算"司机在特定日期赚取的出租车费">的运行总数。最初在Netezza上测试,现在尝试在spark-sql上编码。
但是,如果对于结构为 ((司机,天( --> 票价(的两行,如果"票价"值相同,则running_total列始终显示最终总和!如果所有的票价都是不同的,它被完美地计算。有没有办法在不使用rowsBetween(start,end(的情况下实现这一点(在ANSI SQL或Spark数据帧中(?
示例数据 :
driver_id<<<<>>>>date_id <<<<>>>>fare
10001 2017-07-27 500
10001 2017-07-27 500
10001 2017-07-30 500
10001 2017-07-30 1500
我触发的 SQL 查询以计算运行总计
select driver_id, date_id, fare ,
sum(fare)
over(partition by date_id,driver_id
order by date_id,fare )
as run_tot_fare
from trip_info
order by 2
结果:
driver_id <<<<>>>> date_id <<<<>>>> fare <<<<>>>> run_tot_fare
10001 2017-07-27 500 1000 --**Showing Final Total expecting 500**
10001 2017-07-27 500 1000
10001 2017-07-30 500 500 --**No problem here**
10001 2017-07-30 1500 2000
如果有人能好心地让我知道,我做错了什么,如果它可以在不使用行无界前缀/行之间(b,e(的情况下实现,那么我非常感谢。提前谢谢。
SQL中的传统解决方案是使用range
而不是rows
:
select driver_id, date_id, fare ,
sum(fare) over (partition by date_id, driver_id
order by date_id, fare
range between unbounded preceding and current rows
) as run_tot_fare
from trip_info
order by 2;
如果没有,则两级窗口函数或聚合和连接:
select driver_id, date_id, fare,
max(run_tot_fare_temp) over (partition by date_id, driver_id ) as run_tot_fare
from (select driver_id, date_id, fare ,
sum(fare) over (partition by date_id, driver_id
order by date_id, fare
) as run_tot_fare_temp
from trip_info ti
) ti
order by 2;
(max()
假设票价永远不会为负。