Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得表中分组的平均值并将结果存储回SQL中的原始表_Sql_Tsql - Fatal编程技术网

如何获得表中分组的平均值并将结果存储回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