버스를 타기 위해 사람들이 줄을 서 있습니다. 하지만 버스에는 1000킬로그램의 무게 제한이 있어서 일부 사람들은 탑승하지 못할 수도 있습니다.
무게 제한을 초과하지 않고 버스에 탈 수 있는 마지막 사람의 이름(person_name)을 찾는 해결책을 작성하세요.
테스트 케이스는 첫 번째 사람이 무게 제한을 초과하지 않도록 생성됩니다.
주의할 점은 한 번에 한 사람씩만 버스에 탈 수 있다는 것입니다.
결과 형식은 다음 예시와 같습니다.
Input:
Queue table:
| person_id | person_name | weight | turn |
|---|---|---|---|
| 5 | Alice | 250 | 1 |
| 4 | Bob | 175 | 5 |
| 3 | Alex | 350 | 2 |
| 6 | John Cena | 400 | 3 |
| 1 | Winston | 500 | 6 |
| 2 | Marie | 200 | 4 |
Output:
| person_name |
|---|
| John Cena |
Explanation: The folowing table is ordered by the turn for simplicity.
| Turn | ID | Name | Weight | Total Weight |
|---|---|---|---|---|
| 1 | 5 | Alice | 250 | 250 |
| 2 | 3 | Alex | 350 | 600 |
| 3 | 6 | John Cena | 400 | 1000 |
| 4 | 2 | Marie | 200 | 1200 |
| 5 | 4 | Bob | 175 | ___ |
| 6 | 1 | Winston | 500 | ___ |
누적합이 1000 이하가 되는 사람의 이름을 출력하는 문제다.
SUM() OVER를 사용한 뒤에, 누적합이 1000을 넘지 않는 사람들 중에서 가장 마지막 사람의 이름을 ORDER BY와 LIMIT을 활용해서 추출했다.
SELECT person_name
FROM
(
SELECT person_name, SUM(weight) over(order by turn) as total_weight
FROM Queue
) as total
WHERE total_weight <= 1000
ORDER BY total_weight DESC LIMIT 1;
각 급여 구간(salary category)별 은행 계좌 수를 계산하는 해결책을 작성하세요.
급여 구간은 다음과 같습니다:
"Low Salary": 20,000 미만의 모든 급여
"Average Salary": 20,000 이상 50,000 이하의 모든 급여
"High Salary": 50,000 초과의 모든 급여
결과 테이블에는 세 가지 카테고리가 모두 포함되어야 합니다. 특정 카테고리에 속하는 계좌가 없을 경우 0을 반환하세요.
결과 테이블은 어떤 순서로 반환해도 상관없습니다.
결과 형식은 다음 예시와 같습니다.
Input: Accounts table
| account_id | income |
|---|---|
| 3 | 108939 |
| 2 | 12747 |
| 8 | 87709 |
| 6 | 91796 |
Output
| category | accounts_count |
|---|---|
| Low Salary | 1 |
| Average Salary | 0 |
| High Salary | 3 |
모든 카테고리가 반환되어야 하는게 핵심이다.
따라서 category를 만들어준 뒤, union all로 각각의 카테고리를 병합하는 방식으로 진행한다.
SELECT 'Low Salary' AS category,
SUM(CASE WHEN income < 20000 THEN 1 ELSE 0 END) AS accounts_count
FROM Accounts
UNION ALL
SELECT 'Average Salary',
SUM(CASE WHEN income BETWEEN 20000 AND 50000 THEN 1 ELSE 0 END)
FROM Accounts
UNION ALL
SELECT 'High Salary',
SUM(CASE WHEN income > 50000 THEN 1 ELSE 0 END)
FROM Accounts;
월급이 30,000 미만이고, 동시에 자신의 매니저가 회사를 떠난 직원들의 ID를 찾으세요.
매니저가 회사를 떠나면 Employees 테이블에서 그 매니저의 정보는 삭제되지만, 해당 매니저를 보고하던 직원들의 manager_id 값은 여전히 그 떠난 매니저로 설정되어 있습니다.
결과 테이블은 employee_id 기준으로 정렬해야 합니다.
결과 형식은 아래 예시와 같습니다.
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 |
해당 문제의 조건은 다음과 같다.
1. Salary가 30000 미만이다.
2. 매니저의 아이디(manager_id)가 해당 테이블에 존재하지 않는다.
SELECT employee_id
FROM Employees e
WHERE NOT EXISTS (
SELECT 1
FROM Employees a
WHERE a.employee_id = e.manager_id
) AND salary < 30000 AND e.manager_id IS NOT NULL
ORDER BY employee_id;
문제를 이렇게 풀었으나,
더 간단한 풀이법은 다음과 같다.
SELECT employee_id
FROM Employees
WHERE salary < 30000
AND manager_id NOT IN (
SELECT employee_id FROM Employees
)
ORDER BY employee_id;
보자마자 NOT EXISTS밖에 생각나지 않아서, NOT IN을 생각하지 못했다.
급여가 30,000 미만이면서, manager_id가 employee_id에 없는 즉, 관리자가 테이블에 존재하지 않는 경우를 가져오는 쿼리문이다.