🖥 Задачи, основанные на агрегатных функциях



Язык SQL отлично подходит для агрегации. Для этого есть множество функций, например SUM(), AVG(), MAX(), MIN(), COUNT() и т. д. Знание таких функций — это базовый уровень знаний, который ожидается от кандидата.



Рассмотрим следующую таблицу сотрудников. В каждой строке указаны данные о сотруднике — отдел, зарплата, руководитель и т. д.



-- Table: employees

-- | dept_id | employee_id | amount | manager_id |

-- |---------|-------------|--------|------------|

-- | 1 | 1 | 8000 | 3 |

-- | 1 | 2 | 5000 | 3 |

-- | 1 | 3 | 10000 | null |

-- | 2 | 4 | 15000 | null |

-- | 2 | 5 | 16000 | 4 |

-- | 3 | 6 | 8000 | null |



На основе этой таблицы напишите SQL-запрос, чтобы найти идентификаторы сотрудников, которые зарабатывают больше других в каждом из отделов.



Лучший способ решить любую задачу — это представить ее в виде пошаговой логики. В данном случае мы определяем наибольшую сумму по каждому отделу. Затем определяем формат вывода, для чего нужен только показатель employee_id.



-- Часть 1: Получаем самую высокую зарплату в каждом отделе

SELECT max(amount) AS salary

From employees

GROUP BY dept_id



-- Часть 2: Получаем желаемый формат вывода employee_id

-- Поскольку employee_id нельзя напрямую использовать в группе путем агрегации, мы можем прибегнуть к подзапросам.



SELECT e1.employee_id

FROM employees e1

WHERE e1.amount IN (

SELECT max(e2.amount) AS amount

From employees as e2

GROUP BY e2.dept_id

HAVING e1.dept_id = e2.dept_id )




@sqlhub