-
12/14스파르타/TIL(Today I Learned) 2023. 12. 14. 14:43
1731. The Number of Employees Which Report to Each Employee
The Number of Employees Which Report to Each Employee - LeetCode
Can you solve this real interview question? The Number of Employees Which Report to Each Employee - Table: Employees +-------------+----------+ | Column Name | Type | +-------------+----------+ | employee_id | int | | name | varchar | | reports_to | int |
leetcode.com
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를 사용해서 중복을 제거해야 한다.
Consecutive Numbers - LeetCode
Can you solve this real interview question? Consecutive Numbers - Table: Logs +-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | num | varchar | +-------------+---------+ In SQL, id is the primary key for this table.
leetcode.com
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;