如何获得表中分组的平均值并将结果存储回SQL中的原始表
我有下表:如何获得表中分组的平均值并将结果存储回SQL中的原始表,sql,tsql,Sql,Tsql,我有下表: | Country | Month | Revenue | |---------|-------|---------| | US | Jan | 100 | | US | Feb | 200 | | US | Mar | 300 | | Canada | Jan | 200 | | Canada | Feb | 400 | | Canada | Mar | 500 | 我需要
| Country | Month | Revenue |
|---------|-------|---------|
| US | Jan | 100 |
| US | Feb | 200 |
| US | Mar | 300 |
| Canada | Jan | 200 |
| Canada | Feb | 400 |
| Canada | Mar | 500 |
我需要获得每个国家的平均收入,并将该值存储回原始表,以获得以下输出:
| Country | Month | Revenue | Average |
|---------|-------|---------|---------|
| US | Jan | 100 | 200 |
| US | Feb | 200 | 200 |
| US | Mar | 300 | 200 |
| Canada | Jan | 200 | 366.6 |
| Canada | Feb | 400 | 366.6 |
| Canada | Mar | 500 | 366.6 |
在SQL中实现这一点的最佳方法是什么?使用分区方式是否更好?最好的方法是使用窗口函数:
select t.*, avg(revenue) over (partition by country) as avg_revenue
from t;
要实际执行计算并将其存储回去,需要进行更新
。虽然还有其他方法,但以下是标准SQL:
update t
set average = (select avg(revenue) from t t2 where t.country = t2.country);
编辑:
在T-SQL中,您可以通过执行以下操作在一定程度上提高性能:
with toupdate as (
select t.*,
avg(t.revenue) over (partition by t.country) as new_average
from t
)
update toupdate
set average = new_average;
最好的方法是使用窗口函数:
select t.*, avg(revenue) over (partition by country) as avg_revenue
from t;
要实际执行计算并将其存储回去,需要进行更新
。虽然还有其他方法,但以下是标准SQL:
update t
set average = (select avg(revenue) from t t2 where t.country = t2.country);
编辑:
在T-SQL中,您可以通过执行以下操作在一定程度上提高性能:
with toupdate as (
select t.*,
avg(t.revenue) over (partition by t.country) as new_average
from t
)
update toupdate
set average = new_average;
你在使用什么数据库?请适当地标记。嗨,戈登,我正在使用T-SQL。你在使用什么数据库?请适当地标记。嗨,戈登,我正在使用T-SQL