#postgresql
#postgresql
Вопрос:
У меня вопрос о правильном способе написания запроса.
У меня есть таблица employees, допустим, в ней 4 столбца employee_id
, department
, salary
, email
.
Есть несколько записей без адреса электронной почты, я хотел бы найти наиболее эффективный способ написания SQL-запроса с использованием функции window, которая выводит сумму заработной платы для каждой группы, разделенную на все записи без адреса электронной почты.
У меня есть 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.
Ответ №1:
Ваш второй запрос лучше.
Первый запрос должен сканироваться employees
дважды, в то время как вторая таблица сканирует только (надеюсь, меньший) набор результатов подзапроса для вычисления суммы.
Вполне допустимо оставить OVER
предложение пустым, это просто означает, что все результирующие строки получат одинаковое значение (именно то, что вы хотите).