| 열 이름 | 타입 |
|---|---|
| id | int |
| num | varchar |
이 테이블에서 id는 기본 키(primary key)입니다.
id는 1부터 시작하는 자동 증가(auto increment) 열입니다.
세 번 이상 연속으로 등장하는 숫자를 모두 찾으십시오.
결과 테이블의 출력 순서는 임의(order 상관 없음) 여도 됩니다.
결과 형식은 다음 예시와 같습니다.
Input
| id | num |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
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도 무조건 필요하다!
| Column Name | Type |
|---|---|
| product_id | int |
| new_price | int |
| change_date | date |
(product_id, change_date)는 이 테이블의 기본 키입니다. (즉, 이 두 컬럼의 조합은 각 행마다 고유한 값을 가집니다.)
이 테이블의 각 행은 특정 상품의 가격이 어떤 날짜에 새로운 가격으로 변경되었는지를 나타냅니다.
모든 상품의 초기 가격은 10입니다.
2019년 8월 16일 기준으로 모든 상품의 가격을 구하는 SQL 쿼리를 작성하세요.
결과 테이블의 정렬 순서는 상관없습니다.
결과 형식은 다음 예시와 같습니다.
Input
| product_id | new_price | change_date |
|---|---|---|
| 1 | 20 | 2019-08-14 |
| 2 | 50 | 2019-08-14 |
| 1 | 30 | 2019-08-15 |
| 1 | 35 | 2019-08-16 |
| 2 | 65 | 2019-08-17 |
| 3 | 20 | 2019-08-18 |
Output
| product_id | price |
|---|---|
| 2 | 50 |
| 1 | 35 |
| 3 | 10 |
나의 답
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()를 사용하는 것을 생각했는데 베스트 답안을 보니 스칼라 서브쿼리로 사용했어도 됐었다...