在SAP HANA计算视图中针对重复行计算平均值
解决方案:计算ColumnA唯一值的平均值并保留ColumnC
看起来你是想计算ColumnA唯一值的总平均值(也就是你说的(10+20+50)/3),同时保留原数据里的所有ColumnC行对吧?之前的方法没达到预期,是因为直接按行计算的话,重复的ColumnA值会被多次拆分计入,导致结果偏离目标。我给你两种常用工具的具体实现方案:
1. 用SQL实现
核心思路
先单独计算ColumnA唯一值的平均值,再把这个平均值和原表的所有ColumnC行做关联,这样每一行ColumnC都会带上正确的总平均值。
方法一:用AVG(DISTINCT)直接计算
大部分主流数据库(MySQL、PostgreSQL、SQL Server等)都支持AVG(DISTINCT)语法,可以一步算出唯一值的平均值:
WITH unique_a_avg AS ( SELECT AVG(DISTINCT ColumnA) AS total_avg FROM your_table_name ) SELECT t.ColumnC, u.total_avg FROM your_table_name t CROSS JOIN unique_a_avg u;
方法二:手动求和计数(兼容所有数据库)
如果你的数据库不支持AVG(DISTINCT),可以手动计算唯一值的总和与数量,再求平均:
WITH unique_a_stats AS ( SELECT SUM(DISTINCT ColumnA) AS sum_unique_a, COUNT(DISTINCT ColumnA) AS count_unique_a FROM your_table_name ), total_avg_calc AS ( SELECT sum_unique_a / count_unique_a AS total_avg FROM unique_a_stats ) SELECT t.ColumnC, ta.total_avg FROM your_table_name t CROSS JOIN total_avg_calc ta;
2. 用Python Pandas实现
核心思路
先提取ColumnA的唯一值,计算它们的平均值,再把这个单一值广播到原DataFrame的每一行,最后保留需要的ColumnC和平均值列。
代码示例
import pandas as pd # 假设你的原始数据存储在df中 df = pd.DataFrame({ 'ColumnA': [10, 10, 20, 50, 50], 'ColumnC': ['X', 'X', 'Y', 'Z', 'Z'] }) # 计算ColumnA唯一值的总平均值 unique_a_values = df['ColumnA'].unique() total_avg = unique_a_values.sum() / len(unique_a_values) # 将平均值添加到原DataFrame,保留ColumnC df['total_avg'] = total_avg # 输出结果(仅保留需要的列) result_df = df[['ColumnC', 'total_avg']] print(result_df)
更简洁的写法
df['total_avg'] = df['ColumnA'].unique().sum() / df['ColumnA'].nunique() result_df = df[['ColumnC', 'total_avg']]
为什么你的原方法没生效?
你之前尝试的avg=ColumnA/CA_Count,是把每一行的ColumnA值单独除以唯一值的数量,这样重复的ColumnA会被多次计算。比如10出现两次的话,最终会得到(10/3 + 10/3 + 20/3 + 50/3 +50/3),这和你想要的(10+20+50)/3完全不同。正确的做法是先对ColumnA去重,计算去重后的平均值,再把这个值映射到所有行。
内容的提问来源于stack exchange,提问作者Sarthak Srivastava
相关产品推荐
相关产品推荐

