과연 베이직 챕터의 MEDIUM보다 어드밴스드 챕터의 EASY가 정말 더 쉬울것인가... 두둥
[EASY] 1731. The Number of Employees Which Report to Each Employee
SELF JOIN / COUNT / AVG
⏰ 6:30
SELECT E1.EMPLOYEE_ID, E1.NAME, COUNT(E2.EMPLOYEE_ID) REPORTS_COUNT, ROUND(AVG(E2.AGE),0) AVERAGE_AGE
FROM EMPLOYEES E1
JOIN EMPLOYEES E2
ON E1.EMPLOYEE_ID = E2.REPORTS_TO
GROUP BY 1
ORDER BY 1
[EASY] 1789. Primary Department for Each Employee
UNION
⏰ 22:02
계속 피하고 있던 UNION과 만나버렸다! 구냥 이렇게 따로 구한다음에 합쳐버리면 장⭐땡
SELECT employee_id, department_id
FROM Employee
WHERE primary_flag = 'Y'
UNION
SELECT employee_id, department_id
FROM Employee
GROUP BY employee_id
HAVING COUNT(employee_id) = 1;
[EASY] 610. Triangle Judgement
CASE WHEN
⏰ 5:42
삼각형 법칙 안 까먹었는지 먼저 물어봐주는게 예의 아닌지...??(?)
SELECT x,y,z, CASE WHEN X+Y <= Z THEN 'No'
WHEN X+Z <= Y THEN 'No'
WHEN Y+Z <= X THEN 'No'
ELSE 'Yes' END AS triangle
FROM TRIANGLE
[MEDIUM] 180. Consecutive Numbers
LAG / LEAD / DISTINCT
⏰ 8:21
이 문제는 신박한 정답이 많았다... SQL 원리만 제대로 이해하면 다른 함수 암것두 몰라도 +1 하나로 막 풀 수 있음;
간단한데 신박한 답들! 기억하기 위해 다양하게 남겨본다.
SELECT DISTINCT NUM ConsecutiveNums
FROM (SELECT *, LAG(NUM) OVER(ORDER BY ID) LAG_NUM, LEAD(NUM) OVER(ORDER BY ID) LEAD_NUM
FROM LOGS) L
WHERE NUM = LAG_NUM AND NUM = LEAD_NUM
select distinct num as ConsecutiveNums from Logs
where (id+1,num) in (select * from logs) and (id+2,num) in (select * from logs)
select distinct(a.num) ConsecutiveNums
from logs a, logs b, logs c
where a.id + 1 = b.id and b.id + 1 = c.id and a.num = b.num and b.num = c.num
select distinct a.num as ConsecutiveNums
from logs a
where exists (select 1 from logs b where a.id+1 = b.id and a.num=b.num)
and exists (select 1 from logs c where a.id+2 = c.id and a.num=c.num)
SELECT DISTINCT l1.num as ConsecutiveNums
FROM Logs l1
JOIN Logs l2 on l1.id=l2.id-1
JOIN Logs l3 on l1.id = l3.id-2
WHERE
l1.num=l2.num and l2.num=l3.num and l1.num=l3.num
[MEDIUM] 1164. Product Price at a Given Date
UNION ALL / MAX / MIN
⏰ 28:29
와... 역대급으로 어려웠던 이번 문제. 왜냐면 어려운 함수를 쓰는 게 아닌데 어떻게 짜야 할지 논리구조 자체가 머릿속에서 돌아가지 않았다... 표에 없는 값을 추정해서 뽑아야 하는 문제가 제일 어려운 것 같다.
UNION ALL 을 사실상 거의 처음 써봤는데, 설명에 'UNION'을 쓰게 되면 중복값을 제거하느라 시간이 오래 걸려 보통 추천하지 않지만 UNION ALL 을 쓰면 따로 시간을 안 쓰기 때문에 이런 경우에 쓰기에는 효율적이다. 라고 쓰여 있었다. 참고!
SELECT PRODUCT_ID, 10 AS PRICE
FROM PRODUCTS
GROUP BY PRODUCT_ID
HAVING MIN(CHANGE_DATE) > '2019-08-16'
UNION ALL
SELECT PRODUCT_ID, NEW_PRICE AS PRICE
FROM PRODUCTS
WHERE (PRODUCT_ID, CHANGE_DATE) IN (
SELECT PRODUCT_ID, MAX(CHANGE_DATE)
FROM PRODUCTS
WHERE CHANGE_DATE <= '2019-08-16'
GROUP BY PRODUCT_ID
)
[MEDIUM] 1204. Last Person to Fit in the Bus
SELF JOIN
⏰17:18
코딩이든 데이터든... 이쪽 전문가들은 다 변태가 틀림없어...
[정답 1] WHERE 절에서 셀프조인 후, MAX 값 구해 일치하는 값 출력하기
SELECT person_name FROM Queue
WHERE turn = (
SELECT MAX(turn) as turn FROM
(
SELECT q1.turn
FROM Queue q1 JOIN QUEUE q2
ON q1.turn >= q2.turn
GROUP BY q1.turn
HAVING SUM(q2.weight) <= 1000
) as A
)
[정답 2] 셀프조인 후, 정렬과 LIMIT 활용하기
SELECT q1.person_name
FROM Queue q1 JOIN Queue q2 ON q1.turn >= q2.turn
GROUP BY q1.turn
HAVING SUM(q2.weight) <= 1000
ORDER BY SUM(q2.weight) DESC
LIMIT 1
[정답 3] WITH구문과 윈도우 함수 SUM() OVER() 로 누적 합계 구하기
WITH SUM_TABLE AS (
SELECT PERSON_NAME,
SUM(WEIGHT) OVER (ORDER BY TURN) AS TOTAL_W
FROM QUEUE
)
SELECT PERSON_NAME
FROM SUM_TABLE
WHERE TOTAL_W <= 1000
ORDER BY TOTAL_W DESC
LIMIT 1
[MEDIUM] 1907. Count Salary Categories
UNION
⏰ 3:34
방금 위에서 배워온 UNION으로 3분컷 하고... 개꿀 히히... 하고 심호흡 한뒤 더 좋은 답을 공부하러 다른 답들을 눌러보는데 이게 웬걸? 이번 문제는 모두가 합심해 UNION으로 풀었다.
다르게 풀 수 있는 방법이 없나? 하고 머리를 쥐어짜봤지만 딱봐도 시간 오래 걸리고 복잡한 구문밖에 안 나오게 생겼다. 이런 상황에서는 UNION 적극 활용하기! 땡큐!
SELECT 'Low Salary' AS CATEGORY, COUNT(ACCOUNT_ID) AS ACCOUNTS_COUNT
FROM ACCOUNTS
WHERE INCOME < 20000
UNION ALL
SELECT 'Average Salary' AS CATEGORY, COUNT(ACCOUNT_ID) AS ACCOUNTS_COUNT
FROM ACCOUNTS
WHERE INCOME BETWEEN 20000 AND 50000
UNION ALL
SELECT 'High Salary' AS CATEGORY, COUNT(ACCOUNT_ID) AS ACCOUNTS_COUNT
FROM ACCOUNTS
WHERE INCOME > 50000
항상 가장 이른 아침 일정으로 문제풀이를 했었는데, 오늘은 더 급하고 중요한 일을 먼저 하느라 문제풀이를 저녁으로 미뤘더니 머리가 하나도 돌아가지 않아서 정말 힘들었다...
그동안 더 중요하고 어려운 일 (=포트폴리오 디벨롭하기)을 하기 싫어서 SQL을 회피 수단으로 쓰고 있다고 생각해 조금 죄책감이 들기도 하고, 반성하기도 했는데 어쩌면 내 몸이 어떤 시간에 어떤 일을 하는 게 가장 효율적인지 이미 알고 있어서 나도 모르게 그렇게 따르고 있었는지도 모르겠다는 생각을 했다. 확실히 오히려 포트폴리오 디벨롭 같은 일은 환한 대낮보다 어둑한 밤 시간에 가장 빡 집중하게 되는 경향이 있으니까.
나 잘 써먹는법에 한 줄 추가요!
'[공부] SQL' 카테고리의 다른 글
[SQL 코딩테스트] 해커랭크 Basic Select 정답 (1) | 2024.02.15 |
---|---|
[SQL 코딩테스트] 리트코드 Subqueries 정답 (1) | 2024.02.01 |
[SQL 코딩테스트] 리트코드 Advanced String Functions / Regex / Clause 정답 (0) | 2024.01.29 |
[SQL 코딩테스트] 프로그래머스 JOIN 정답 (0) | 2024.01.26 |
[SQL 코딩테스트] 프로그래머스 GROUP BY 정답 (1) | 2024.01.25 |