SQL 문제풀이 복습
SELECT email AS "Email"
FROM person
GROUP BY 1
HAVING Count(*) >= 2;
SELECT c.name AS "Customers"
FROM customers c
LEFT JOIN orders o
ON c.id = o.customerid
WHERE o.id IS NULL;
문제 링크
6월 29일에 처음 풀었던 문제.
CTE를 쓰면 서브쿼리를 안 만들어도 되지만
서브쿼리를 쓰는 게 연산상 조금은 더 유리할 수 있다고 한다.
오늘은 오랜만에 감도 살릴 겸 인라인뷰 서브쿼리를 만들어서 해결해 봄.
근데 이건 케바케라 무조건 서브쿼리가 낫다,
CTE가 낫다라고 얘기하기는 어렵고
EXPLAIN을 써서 성능을 최적화하는 건 아직 내가 커버할 영역이 아님.
SELECT department,
employee,
salary
FROM (SELECT d.NAME AS "Department",
e.NAME AS "Employee",
e.salary AS "Salary",
Rank()
OVER(
partition BY d.id
ORDER BY e.salary DESC) AS "ranking"
FROM employee e
JOIN department d
ON e.departmentid = d.id) a
WHERE ranking = 1;
▼ 6/29에 제출한 정답 쿼리.
CTE를 만들어서 해결했고
dense_rank를 써서 순위를 구했음 (어차피 1등을 뽑는거라 뭐든간에 상관X)
WITH result
AS (SELECT d.NAME Department,
e.NAME Employee,
e.salary,
Dense_rank()
OVER(
partition BY d.NAME
ORDER BY salary DESC) AS ranking
FROM employee e
INNER JOIN department d
ON e.departmentid = d.id)
SELECT department,
employee,
salary
FROM result
WHERE ranking = '1';