我对编写查询的正确方法有疑问。
我有一个employees表,可以说有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更有效,但这是正确的方法吗?并将over子句留空是否有效?
刚开始使用PostgreSQL而不是MySQL 5.6。
答案 0 :(得分:0)
您的第二个查询更好。
第一个查询必须扫描employees
两次,而第二个表仅扫描子查询的(希望更小)结果集以计算总和。
将OVER
子句留空是完全有效的,这仅意味着所有结果行将获得相同的值(这是您想要的值)。