610. Triangle Judgement

주어진 x, y, z로 삼각형이 가능한지 확인하라는 문제이다.
모든 경우의 두 변의 합이 나머지 한 변보다 작으면 삼각형이 성립하게 된다.
따라서 3개의 경우의 수를 모두 if문으로 확인 후 결과를 내는 방법으로 풀었다.

SELECT x,
	   y,
       z,
       if((x+y > z and x+z > y and y+z > x), 'Yes', 'No') as triangle
FROM Triangle

180. Consecutive Numbers

기본키인 id의 num컬럼의 숫자가 연속으로 같은 숫자 3번 이상이 나오게 된다면 해당 num을 출력하는 문제이다.
나는 with 구문으로 가상테이블을 만들고 Logs 테이블에서 각각의 id부터 밑으로 두 번째까지의 숫자를 Lead_1, Lead_2 컬럼을 추가하고 LEAD_T라고 가상테이블명을 지정했다.
LEAD_T 테이블을 이용해서 num, Lead_1, lead_2가 모두 같은 경우의 num을 출력해서 풀었다.

WITH LEAD_T AS (
    SELECT id, num,
           LEAD(num) over (order by id) as Lead_1,
           LEAD(num, 2) over (order by id) as Lead_2
    FROM Logs
)

SELECT Distinct num AS 'ConsecutiveNums'
FROM LEAD_T
WHERE num = Lead_1
and Lead_1 = Lead_2

1164. Product Price at a Given Date

'2019-08-16' 이전에 가장 최근 product_id의 new_price를 출력하고 그 이후에 해당하지 않았던 product_id는 10으로 출력하는 문제이다.
우선 가상테이블로 '2019-08-16' 이전 데이터 중에 최근 값을 가져오기 위해서 window fuction(ROW_NUMBER)을 이용하여 product_id별 change_date의 내림차순으로 number를 부여하여 RN_Products(가상테이블)을 만들었다.

가상테이블에서 가장 최근의 값만 가져오기 위해 메인쿼리문에서 RN_Products 테이블에서 rn이 1인 쿼리문을 작성했다.
그 다음 union 으로 중복없이 나머지 product_id도 가져오기 위해서 두 번째 쿼리문으로 기존에 주어진 Products테이블에서 RN_Products(가상테이블)에 해당하지 않는 product_id만 가져오기 위해 WHERE절에 조건을 주었고 추출된 products_id의 price는 10으로 고정해서 두 쿼리문을 union으로 합쳐서 풀었다.
-> 개인적으로 쿼리문 마지막 줄에 WHERE절의 해결방법을 찾는 것이 가장 힘들었다. not in으로 해당되지 않는 중복된 값을 걸러내는 작업에서 자주 활용해야할 것 같다.

WITH RN_Products as(
SELECT product_id,
       new_price,
       change_date,
       ROW_NUMBER() over(PARTITION BY product_id order by change_date desc) as rn
FROM Products
where change_date <= '2019-08-16'
)

SELECT product_id, new_price as price
FROM RN_Products
where rn = 1
union
SELECT product_id, 10 as price
FROM Products
where product_id not in (select product_id from RN_Products)
profile
Data analyst를 향해 도전하는 이야기

0개의 댓글