如何用SQL计算分组平均值,保留已有mid值并生成视图?
解决思路:保留已有
mid值,仅补全缺失的计算值 这个需求的核心其实就是优先保留现有数据,只在缺失时计算填充,用SQL里的内置函数就能轻松搞定,结合GROUP BY的场景也有对应的处理方式,下面分情况给你说:
1. 单行列级补全(无分组)
如果你的表已经有mid字段,但部分行的mid为NULL(也就是你说的“不存在该mid值”),直接用COALESCE函数就能实现需求——它会返回第一个非NULL的参数,完美避免覆盖已有值:
SELECT -- 保留原表所有其他字段 id, group_id, high, low, -- 优先用已有mid,没有就计算(high+low)/2 COALESCE(mid, (high + low) / 2) AS mid FROM your_table;
要是你的表根本没有mid字段,那直接新增这个计算列就行,不需要判断(因为本来就不存在):
SELECT *, (high + low) / 2 AS mid FROM your_table;
2. 结合GROUP BY的分组补全
如果需要按某个字段分组统计,同时要保留组内已有的mid值(比如组内只要有一行有mid就用那个值,没有再计算组内平均),可以用聚合函数配合COALESCE:
假设你按group_id分组,想要每组的high/low的聚合值(比如最大值或平均值),同时处理mid:
SELECT group_id, -- 这里根据你的业务需求选聚合函数,比如MAX/AVG MAX(high) AS group_high, MAX(low) AS group_low, -- 先取组内非NULL的mid(用MAX忽略NULL),没有就计算组内high和low的平均 COALESCE(MAX(mid), (AVG(high) + AVG(low)) / 2) AS group_mid FROM your_table GROUP BY group_id;
这里用MAX(mid)是因为如果组内有非NULL的mid值,MAX会直接返回它(NULL会被聚合函数忽略);如果组内全是NULL,就用组内high和low的平均值来生成mid。
3. 封装成视图
把上面的查询封装成视图,就能随时调用包含补全后mid值的数据集了:
比如单行列级的视图:
CREATE VIEW your_complete_view AS SELECT id, group_id, high, low, COALESCE(mid, (high + low) / 2) AS mid FROM your_table;
之后直接查询这个视图就好:SELECT * FROM your_complete_view;
小提醒
如果你的high和low是整数类型,直接(high+low)/2可能会得到整数结果(比如3+4=7,7/2=3),要是需要保留小数的话,把字段转成数值类型再计算:
COALESCE(mid, (high::NUMERIC + low::NUMERIC) / 2) AS mid
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

