-
12/14스파르타/TIL(Today I Learned) 2023. 12. 14. 14:43
1731. The Number of Employees Which Report to Each Employee
select e2.employee_id, e2.name, COUNT(e1.employee_id) as reports_count, ROUND(AVG(e1.age)) as average_age from employees e1 join employees e2 on e1.reports_to = e2.employee_id group by employee_id order by employee_id
이 문제를 풀 때 서브쿼리를 사용해서 문제를 풀려고 노력했다.
from절에 넣어서 reports_count와 average_age를 구하고
union으로 name과 employee_id를 구하려 했지만
union은 먼저 쓴 column만 나오기 때문에 name과 employee_id가 나오지 않았다.
재귀호출을 통해서 하려 했지만 조건을 잘못 설정하여
e1.employee_id = e2.employee_id라고 조건을 설정하여 오류가 났다.
우리가 문제를 보면 e1.reports_to = e2.employee_id라는 조건을 만족해야 하기 때문에
재귀호출을 할 때 조건을 걸어서 해결하였다.
1789. Primary Department for Each Employee
SELECT DISTINCT employee_id, department_id FROM Employee WHERE employee_id IN ( SELECT employee_id FROM Employee GROUP BY employee_id HAVING COUNT(*) = 1 # N과 Y의 여부와 상관없이 하나만 있는 id를 출력한다. ) OR primary_flag = 'Y' ORDER BY employee_id;
where절에 서브 쿼리를 보면 count(*) =1인 즉
employee_id가 1개만 있는 유일한 column을 출력한다.
1개만 있는 열은 Y, N의 상관없이 나와야 한다.
이후 or을 사용하여 Y인 열을 추출한다.
disticnt를 사용해서 중복을 제거해야 한다.
num이 최소 3번 연속으로 나오는 id를 구하는 문제
count를 사용하면 연속으로 나오는지를 모르기 때문에 실패
그러던 중 lead , lag함수를 알게 되었다.
윈도우 함수이며 rank와 같은 형식을 지원한다.
lag는 이전의 행을 가져오는 것
lead는 다음 행을 가져오는 것.
서브쿼리를 from절에 넣는다.
lag를 통해 새로운 변수 lag_1을 만든다. 이는 한 개 전의 행을 말한다.(이전 행)
lag를 통해 두 번째 변수 lag_2 만든다. 이는 두 개 전의 행을 말한다. (전전 행)
num이 3일 때 lag_1은 id =2를 의미하며 , lag_2는 id=1을 의미한다.
이렇게 나온 3개의 변수가 다 동일하다면 = 연속된 같은 값을 가진다면
그 num을 출력하겠다는 문제였다.
select distinct num as ConsecutiveNums from( SELECT id, num, lag(num, 1) over(order by id) as lag_1, lag(num, 2) over(order by id) as lag_2 from Logs )t WHERE num = lag_1 and num = lag_2;