按行求和的SQL实现问题:分析函数使用不当如何获取目标表输出?
嘿,我来帮你搞定这个分析函数的问题!你提到的“按行求和”一般有两种常用场景,结合你的rides表数据,我给你分别写出正确的SQL:
场景1:每行显示对应分组的总计值
如果你想让每行都展示该司机的总行驶里程、总车费(或者某天的总计),可以用PARTITION BY指定分组字段,不需要加ORDER BY,因为是计算整个分组的总和:
SELECT ride_id, driver_id, ride_in_kms, ride_fare, ride_date, -- 该司机的总行驶里程 SUM(ride_in_kms) OVER (PARTITION BY driver_id) AS total_kms_per_driver, -- 该司机的总车费 SUM(ride_fare) OVER (PARTITION BY driver_id) AS total_fare_per_driver FROM rides;
举个例子,driver_id=1的三行数据里,total_kms_per_driver都会显示3+4+7=14,total_fare_per_driver都会显示4.45+8.46+16.77=29.68,原表的每行数据都保留,同时附加分组总计。
如果想按日期分组(显示每行对应的当天总里程/车费),只需要把PARTITION BY driver_id换成PARTITION BY ride_date即可。
场景2:分组内的累计求和(按行递进累计)
如果你的需求是按司机分组,按订单顺序累计里程/车费(比如每行显示到当前订单为止,该司机的累计行驶里程),那就要在OVER()里加上ORDER BY指定累计的顺序:
SELECT ride_id, driver_id, ride_in_kms, ride_fare, ride_date, -- 按ride_id顺序累计的司机行驶里程 SUM(ride_in_kms) OVER (PARTITION BY driver_id ORDER BY ride_id) AS cumulative_kms, -- 按ride_id顺序累计的司机车费 SUM(ride_fare) OVER (PARTITION BY driver_id ORDER BY ride_id) AS cumulative_fare FROM rides;
还是拿driver_id=1的例子:
- ride_id=1的行,
cumulative_kms是3,cumulative_fare是4.45 - ride_id=2的行,
cumulative_kms是3+4=7,cumulative_fare是4.45+8.46=12.91 - ride_id=7的行,
cumulative_kms是3+4+7=14,cumulative_fare是29.68
关键说明
分析函数和普通GROUP BY的区别在于:分析函数不会合并行,原表的每一行都会保留,同时把聚合结果附加到对应行,这也是它适合“按行求和”需求的原因。
内容的提问来源于stack exchange,提问作者kake
相关产品推荐
相关产品推荐

