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
相关产品推荐
相关产品推荐

