我有一个关于编写查询的正确方法的问题。
我有一个员工表,让我们说有4列employee_id
,department
,salary
,email
。
有一些没有电子邮件地址的记录,我想找到使用窗口函数编写SQL查询的最有效方法,它带来每组的工资总和除以所有没有电子邮件地址的工资。
我有2个解决方案,当然只有一个是高效的,任何人都可以给出任何建议吗?
select department, sum(salary) as total
from employees
where email is null
group by 1
选项1
select a.department , a.total/(select sum(salary) from employees where email is null)
from (
select department, sum(salary) as total
from employees
where email is null
group by 1
) a
选项2
select a.department , a.total/sum(a.total) over()
from (
select department, sum(salary) as total
from employees
where email is null
group by 1
) a
我想查询2更有效率,但它是正确的方法吗?将条款留空是否有效?
刚开始使用PostgreSQL而不是MySQL 5.6。
你的第二个问题更好。
第一个查询必须扫描employees
两次,而第二个表只扫描子查询的(希望更小)结果集来计算总和。
将OVER
子句留空是完全有效的,这意味着所有结果行将获得相同的值(这是您想要的)。