You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按行求和的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 14:53:13