现有一张表:salary
结构如下:
emp_id salary
100 5000
100 3000
100 4000
101 2000
101 2500
102 4500
...
字段emp_id有重复。
现需要计算每个emp_id的平均salary值,并存入表avg_salary
表avg_salary的字段为:emp_id(主键,唯一),salary
存入时需要对salary的值进行降序排列
salary表有6000万行
求效率高的SQL语句
谢谢!
SQL
------解决方案--------------------
效率高的肯定是这样的:
truncate table avg_salary
insert into avg_salary
select emp_id, AVG(salary)
from salary
group by emp_id
但是这么多数据的话没人会这么做,而是使用触发器,平均分散计算压力。
你这6000多万行数据,这么执行一次,怎么也好好几十分钟了。
------解决方案--------------------
存入时排不排序不重要,规范的做法是在你提取的时候用order by 最保险。
对于6000万的表,建议根据emp_id 范围分批次导入到avg_salary 比较靠普,比如每次1百万。
declare @t table(emp_id int, salary money)
insert into @t
select 100,5000 union all
select 100,3000 union all
select 100,4000 union all
select 101,2000 union all
select 101,2500 union all
select 102,4500
--insert into @avg
select emp_id,sum(salary)/count(emp_id) avg_salary
from @t
--where emp_id>=100 and emp_id<100+1000000
group by emp_id
--order by sum(salary)/count(emp_id) avg_salary desc