주어진 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
기본키인 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
'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)