[SQL]_코드카타_109번~110번

JIYUU·2025년 8월 1일

109번 문제

문제

열 이름타입
idint
numvarchar

이 테이블에서 id는 기본 키(primary key)입니다.
id는 1부터 시작하는 자동 증가(auto increment) 열입니다.

세 번 이상 연속으로 등장하는 숫자를 모두 찾으십시오.
결과 테이블의 출력 순서는 임의(order 상관 없음) 여도 됩니다.
결과 형식은 다음 예시와 같습니다.

Input

idnum
11
21
31
42
51
62
72

Output

ConsecutiveNums
1

나의 답

select
    distinct l3.num as ConsecutiveNums
from logs l1
join logs l2 on l2.id = l1.id+1
join logs l3 on l3.id = l1.id+2
where l1.num = l2.num and l1.num = l3.num

베스트 답

SELECT DISTINCT l1.num AS ConsecutiveNums
FROM Logs l1, Logs l2, Logs l3
WHERE l1.num = l2.num
  AND l2.num = l3.num
  AND l1.id = l2.id - 1
  AND l2.id = l3.id - 1;

이번 문제는 거의 다 맞춰놓고 다른 테스트 케이스에서 틀려서 구글링과 GPT의 도움을 받았다...
몰랐던 사실인데 WHERE절에서 연쇄비교는 내가 생각한 방식으로 작동하지 않았다.

WHERE A = B = C의 경우 동시에 비교가 작동되는 것이 아니라,
WHERE (A = B) = C로 작동한다. 따라서 (A = B) 부분이 참일 경우 1, 거짓일 경우 0을 반환하게 되고 1 = C, 0 = C와 같은 비교가 되기 때문에 의도한 비교가 이루어지지 않는다. 그래서 다른 테스트 케이스에서는 제대로 작동하지 않았던 것.
그리고 세 번 이상 연속으로 등장하는 숫자를 찾는 것이기 때문에 DISTINCT도 무조건 필요하다!


110번 문제

Column NameType
product_idint
new_priceint
change_datedate

(product_id, change_date)는 이 테이블의 기본 키입니다. (즉, 이 두 컬럼의 조합은 각 행마다 고유한 값을 가집니다.)

이 테이블의 각 행은 특정 상품의 가격이 어떤 날짜에 새로운 가격으로 변경되었는지를 나타냅니다.

모든 상품의 초기 가격은 10입니다.
2019년 8월 16일 기준으로 모든 상품의 가격을 구하는 SQL 쿼리를 작성하세요.
결과 테이블의 정렬 순서는 상관없습니다.
결과 형식은 다음 예시와 같습니다.

Input

product_idnew_pricechange_date
1202019-08-14
2502019-08-14
1302019-08-15
1352019-08-16
2652019-08-17
3202019-08-18

Output

product_idprice
250
135
310

나의 답

select 
    p1.product_id, 
    coalesce(p2.price, 10) as price
from 
    products p1
left join(
	select 
        product_id, 
        last_value(new_price) over(partition by product_id order by change_date rows between unbounded preceding and unbounded following) as price
    from products
    where change_date <= '2019-08-16'
) as p2
on p1.product_id = p2.product_id
group by 1

베스트 답안

SELECT 
    p.product_id,
    COALESCE(
        (SELECT new_price
         FROM Products p2
         WHERE p2.product_id = p.product_id
           AND p2.change_date <= '2019-08-16'
         ORDER BY p2.change_date DESC
         LIMIT 1),
        10
    ) AS price
FROM (
    SELECT DISTINCT product_id
    FROM Products
) p;

처음부터 LAST_VALUE()를 사용하는 것을 생각했는데 베스트 답안을 보니 스칼라 서브쿼리로 사용했어도 됐었다...

0개의 댓글