☑️ 1204. Last Person to Fit in the Bus
[문제]
- There is a queue of people waiting to board a bus. However, the bus has a weight limit of 1000 kilograms, so there may be some people who cannot board.
- Write a solution to find the person_name of the last person that can fit on the bus without exceeding the weight limit. The test cases are generated such that the first person does not exceed the weight limit.
- 버스에 탄 사람 순서대로 누적 무게 구한뒤, 마지막으로 탑승가능한 사람 이름 출력 하기
[문제 풀이]
내 코드
with total as (
select *
,sum(weight) over (order by turn) as total_weight
from queue
order by turn
)
select person_name
from total
where total_weight<=1000
order by turn DESC
limit 1
이슈 및 해결 과정
- 누적 무게 집계는 윈도우 함수 활용: `SUM() OVER ( ORDER BY 순서) `
- 오류 상황 : 문제 이해 오류
- 문제 에서는 초과 되기 전, FIT 한 마지막 사람을 찾으라고 했는데 나는 초과된 첫번째 사람 이름을 찾아서 계속 오류가 났음 . 아우터 쿼리 조건에 WHERE total_weight>=1000 order by turn asc 이렇게 작성
- 문제 다시 제대로 읽고 필터링 조건 및 정렬 조건 수정하여 해결
한줄 포인트
- 누적합은 sum 윈도우 함수 & 윈도우 파라미터로 order by 순서 지정
- 문제를 제대로 읽자.
☑️ 1907. Count Salary
[문제]
- Write a solution to calculate the number of bank accounts for each salary category. The salary categories are:
- "Low Salary": All the salaries strictly less than $20000.
- "Average Salary": All the salaries in the inclusive range [$20000, $50000].
- "High Salary": All the salaries strictly greater than $50000.
- 연봉 조건별 카테고리를 3가지로 나눠라, 해당 안되는 조건도 0으로 집계하고 출력할것 .
[문제 풀이]
내 코드
WITH uni AS ( #카테고리 생성
SELECT CASE WHEN INCOME <20000 THEN'Low Salary'
WHEN INCOME <=50000 THEN'Average Salary'
WHEN INCOME >50000 THEN'High Salary'
ELSE 0
END AS category
,SUM(CASE WHEN INCOME <20000 THEN 1
WHEN INCOME <=50000 THEN 1
WHEN INCOME >50000 THEN 1
ELSE 0
END)AS accounts_count
FROM ACCOUNTS
GROUP BY category
UNION
SELECT 'Average Salary' as category # 값이 0인 경우 추가
,0 as accounts_count
FROM ACCOUNTS
)
# 없는 행을 만들때 union 으로 접근
SELECT category
,MAX(accounts_count) AS accounts_count
FROM uni
GROUP BY category
수정 코드
SELECT 'Low Salary' AS category,
COUNT(if(income<20000,1,null)) AS accounts_count
FROM Accounts
UNION
SELECT 'Average Salary',
COUNT(if(income>=20000 and income<=50000,1,null))
FROM Accounts
UNION
SELECT 'High Salary',
COUNT(if(income>50000,1,null))
FROM Accounts
이슈 및 해결 과정
- 조건별 피벗 컬럼 추가하는건 어렵지 않았는데, average_salary 를 카운팅 할수있는 값이 없어 행 추가 해주는 개념으로 접근 시작
- 10분 고민 끝에, 조건별 피벗 컬럼 with 문으로 묶고 union 으로 코드 추가 작성 했는데, 문제는 average_salary 값이 있는 케이스에 average = 0 행 추가 되어 두개다 통과가 안됐음
- 마지막 아우터 쿼리에 group by 후 max 값으로 집계 해주고 통과함
- 다만, 작성한 쿼리는 low, high salary 조건값이 0일경우 또 추가 해줘야 한다는 번거로움이 있어 반복성이 좋지 않은 쿼리임.
- 각각의 조건별 개별 카운팅 후에 union 으로 연결해서 더 간단한게 수정 완료
한줄 포인트
- 없는 조건 값으로 행 추가해줄때는 union 사용 (ex. 테이블에 a,b,c 중 a,b 밖에 없는데 c=0으로 출력 할때)
'SQL' 카테고리의 다른 글
코테 준비 | Movie Rating (JOIN,UNION ALL) (0) | 2025.01.09 |
---|---|
코테 준비 | Exchange Seats ( 홀수 짝수 자리바꾸기 - LAG,LEAD) (0) | 2025.01.07 |
코테 준비 | Percentage of Users Attended a Contest / Queries Quality and Percentage (2) | 2024.12.23 |
QCC | 2회차 코드 리뷰 & 피드백 (0) | 2024.12.20 |
QCC | 1회차 코드 리뷰 & 피드백 (0) | 2024.12.13 |