Полистала я список задач из блока SQL 50 на LeetCode и наткнулась на одну единственную задачку уровня hard. Решила проверить свои силы и решить ее. Задача относится к уровню Hard. Давайте разберем, что нужно было сделать и как я с этим справилась. 💼💡
📝 Условие задачи:
У нас есть две таблицы:
1️⃣Employee с колонками: id, name, salary, departmentId.
2️⃣Department с колонками: id, name.
Задача: найти сотрудников, которые входят в топ-3 по зарплате в каждом департаменте. При этом нужно учитывать только уникальные зарплаты. То есть, если несколько сотрудников имеют одинаковую зарплату, они занимают одно и то же место в рейтинге.
Для решения задачи я использовала SQL с функцией DENSE_RANK(), которая позволяет ранжировать сотрудников по зарплате внутри каждого департамента. Решала тестировала в юпитере. Вот как это выглядит:
import pandas as pd
from pandasql import sqldf
employee_data = {
'id': [1, 2, 3, 4, 5, 6, 7],
'name': ['Joe', 'Henry', 'Sam', 'Max', 'Janet', 'Randy', 'Will'],
'salary': [85000, 80000, 60000, 90000, 69000, 85000, 70000],
'departmentId': [1, 2, 2, 1, 1, 1, 1]
}
Employee = pd.DataFrame(employee_data)
department_data = {
'id': [1, 2],
'name': ['IT', 'Sales']
}
Department = pd.DataFrame(department_data)
Я покрутила данные и так и так и поняла, что мне проще сделать с оконкой такое задание. Можно и подзапросом конечно решить, но на мой взгляд оконка тут просто идеально подходит.
query = """
select Department,Employee,Salary
from
(SELECT d.name as Department,
e.name as Employee,
salary as Salary,
dense_rank() OVER (PARTITION BY d.name order by salary desc) as rank
FROM Employee AS e
LEFT JOIN Department d on d.id=e.departmentId
order by d.id, salary desc
)
where rank <=3
"""
sqldf(query)
💡DENSE_RANK() позволяет ранжировать сотрудников по зарплате, при этом сотрудники с одинаковой зарплатой получают одинаковый ранг.
💡PARTITION BY d.name группирует данные по департаментам.
💡ORDER BY salary DESC сортирует зарплаты по убыванию.
В итоге мы выбираем только те строки, где ранг меньше или равен 3.
Дайте знать если в таких задачках вам нужен файл юпитерский сразу с кодом. Буду прикреплять тогда.
P.S. Кстати за прошлую неделю я выдала медали в нашем рейтинге. 🥇🥈🥉Заглядывайте и присоединяйтесь!
