SQL 문제풀이 복습
오늘은 특별히 기록해 둘 만한 풀이는 없음
SELECT user_id,
count(DISTINCT follower_id) AS "followers_count"
FROM Followers
GROUP BY 1
ORDER BY 1;
SELECT e1.employee_id,
e1.name,
count(DISTINCT e2.employee_id) AS "reports_count",
round(avg(e2.age)) AS "average_age"
FROM Employees e1
JOIN Employees e2
ON e1.employee_id = e2.reports_to
GROUP BY 1
ORDER BY 1;
SELECT event_day AS "day",
emp_id,
sum(out_time - in_time) AS "total_time"
FROM Employees
GROUP BY 1,
2;
프로그래머스의 가장 안 좋은 점은
틀린 '사례'를 제공해 주지 않는다는 것.
어디서 왜 틀렸는지 빠르게 알아낼 수 없는 점은 답답하다.
비트 연산 문제는 그냥 포기.
문제 링크
WITH FRONTEND
AS (SELECT Sum(CODE)
FROM SKILLCODES
WHERE CATEGORY = 'Front End')
SELECT ID,
EMAIL,
FIRST_NAME,
LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (SELECT *
FROM FRONTEND) > 0
ORDER BY 1;
SELECT ID,
EMAIL,
FIRST_NAME,
LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (SELECT CODE
FROM SKILLCODES
WHERE NAME = 'Python')
OR SKILL_CODE & (SELECT CODE
FROM SKILLCODES
WHERE NAME = 'C#')
ORDER BY 1;
SELECT ID,
EMAIL,
FIRST_NAME,
LAST_NAME
FROM DEVELOPER_INFOS
WHERE SKILL_1 = 'Python'
OR SKILL_2 = 'Python'
OR SKILL_3 = 'Python'
ORDER BY 1;
문제 링크
item_tree에서 부모자식 관계를 먼저 확인한 후
더 이상 자식이 없으면 완성템이다.
이 결과를 인라인뷰로 저장한 후 ITEM_INFO 테이블과 조인하면 끝.
SELECT i.ITEM_ID,
i.ITEM_NAME,
i.RARITY
FROM ITEM_INFO i
JOIN (SELECT i1.ITEM_ID
FROM ITEM_TREE i1
LEFT JOIN ITEM_TREE i2
ON i1.ITEM_ID = i2.PARENT_ITEM_ID
WHERE i2.ITEM_ID IS NULL) a
ON i.ITEM_ID = a.ITEM_ID
ORDER BY 1 DESC;
문제 링크
서브쿼리를 여러 번 중첩시키면 해결은 어렵지 않은 문제.
TREE 구조에서 부모와 자식을 구분하는 것이 항상 헷갈린다ㅎㅎ
SELECT i2.item_id,
i2.item_name,
i2.rarity
FROM ITEM_INFO i2
JOIN (SELECT it.item_id
FROM ITEM_TREE it
JOIN (SELECT item_id
FROM ITEM_INFO
WHERE rarity = 'RARE') a
ON it.parent_item_id = a.item_id) b
ON i2.item_id = b.item_id
ORDER BY 1 DESC;