Table: Employees
+-------------+----------+
| Column Name | Type |
+-------------+----------+
| employee_id | int |
| name | varchar |
| manager_id | int |
| salary | int |
+-------------+----------+
SQL에서 employee_id는 이 테이블의 기본 키입니다. 이 테이블은 직원들에 대한 정보, 급여 및 관리자 ID를 포함하고 있습니다. 일부 직원들은 관리자가 없어서 (manager_id가 null입니다).
급여가 30,000달러 미만이고 관리자가 회사를 떠난 직원들의 ID를 찾으세요. 관리자가 회사를 떠나면 해당 관리자의 정보는 Employees 테이블에서 삭제되지만, 보고서에는 여전히 해당 직원의 manager_id가 떠난 관리자의 ID로 설정되어 있습니다.
결과 테이블은 employee_id 순으로 정렬하여 반환하세요.
Example 1:
Input:
Employees table:
+-------------+-----------+------------+--------+
| employee_id | name | manager_id | salary |
+-------------+-----------+------------+--------+
| 3 | Mila | 9 | 60301 |
| 12 | Antonella | null | 31000 |
| 13 | Emery | null | 67084 |
| 1 | Kalel | 11 | 21241 |
| 9 | Mikaela | null | 50937 |
| 11 | Joziah | 6 | 28485 |
+-------------+-----------+------------+--------+
Output:
+-------------+
| employee_id |
+-------------+
| 11 |
+-------------+
설명: 급여가 30,000달러 미만인 직원은 1번 (Kalel)과 11번 (Joziah)입니다. Kalel의 관리자는 11번 직원으로, 현재 회사에 재직 중인 Joziah입니다. Joziah의 관리자는 6번 직원인데, 이 직원은 회사에서 떠났기 때문에 해당 직원에 대한 정보가 삭제되어 데이터베이스에 존재하지 않습니다.
✏️ 풀이
import pandas as pd
def find_employees(employees: pd.DataFrame) -> pd.DataFrame:
df = employees[(employees['salary'] < 30000) & (~employees['manager_id'].isna())]
df_merge = pd.merge(df, employees, how='left', left_on='manager_id', right_on='employee_id')
return df_merge[df_merge['manager_id_y'].isna()][['employee_id_x']].rename(columns={'employee_id_x':'employee_id'})
📚 개념정리
merge() ? 두 객체를 병합하는 메서드 (join과 비슷하나 더 세부적 설정이 가능)
df.merge(how='inner', on=None, left_on=None, right_on=None, sort=False, suffixes=('_x', '_y'))
how : 병합시 기준이 될 인덱스 (left / right / inner / outer / cross)
on : 열 기준 병합 시 기준으로 할 열의 이름
left_on, right_on : 열 기준 병합 시 양쪽 열 이름이 다르다면 각각 어떤 열을 기준으로 할지 설정
sort : 병합 후 인덱스 정렬 여부
suffixes : 병합할 객체들 간 이름이 중복되는 열이 있다면 뒤에 붙일 접미사를 정함