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

Oracle SQL或Python如何实现增量平均值计算

增量平均值计算实现方案(Oracle + Python)

Oracle实现

由于MARKS字段为VARCHAR2(50 CHAR)类型,计算前需要显式转换为数值类型避免报错,有两种常用实现方式:

方式1:直接使用AVG开窗函数(推荐,面试优先答)

Oracle的AVG聚合函数支持开窗计算,默认窗口为从第一行到当前行,刚好匹配增量平均值需求:

SELECT 
    c1.*,
    SUM(TO_NUMBER(MARKS)) OVER (ORDER BY c1.NAME) AS CUM_COUNT,
    ROUND(AVG(TO_NUMBER(MARKS)) OVER (ORDER BY c1.NAME), 2) AS AVGS_CNT
FROM EMP c1 
ORDER BY c1.NAME ASC;

如果你的需求需要按日期分区计算(比如每日单独算累计值),只需要在开窗函数中增加PARTITION BY 日期字段即可,示例:

SUM(TO_NUMBER(MARKS)) OVER (PARTITION BY STAT_DATE ORDER BY c1.NAME) AS CUM_COUNT

方式2:累计和除以行号(和你现有逻辑对齐)

如果要基于你已经写好的SUM累计逻辑扩展,直接用累计值除以当前行的序号即可:

SELECT 
    c1.*,
    SUM(TO_NUMBER(MARKS)) OVER (ORDER BY c1.NAME) AS CUM_COUNT,
    ROUND(SUM(TO_NUMBER(MARKS)) OVER (ORDER BY c1.NAME) / ROW_NUMBER() OVER (ORDER BY c1.NAME), 2) AS AVGS_CNT
FROM EMP c1 
ORDER BY c1.NAME ASC;

Python实现

如果是从Oracle拉取数据后用Python处理,可借助pandas的expanding窗口实现:

import pandas as pd
import cx_Oracle

# 1. 连接Oracle读取数据,替换为你自己的连接信息
conn = cx_Oracle.connect('username/password@host:port/service_name')
df = pd.read_sql("SELECT * FROM EMP ORDER BY NAME ASC", con=conn)
conn.close()

# 2. 转换MARKS为数值类型
df['MARKS'] = pd.to_numeric(df['MARKS'], errors='coerce')

# 3. 计算累计和与增量平均值
df['CUM_COUNT'] = df['MARKS'].cumsum()
df['AVGS_CNT'] = df['MARKS'].expanding().mean().round(2)

# 输出结果
print(df)

其中expanding()表示窗口从数据集第一行一直覆盖到当前行,刚好满足增量计算的要求。

内容的提问来源于stack exchange,提问作者codeholic24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:06:02