개발은 처음이라 개발새발

MySQL DATE_ADD & Self Join 퀴즈2 [LeetCode] 본문

mysql

MySQL DATE_ADD & Self Join 퀴즈2 [LeetCode]

leon_choi 2023. 5. 9. 00:24
반응형

https://leetcode.com/problems/rising-temperature/

 

Rising Temperature - LeetCode

Can you solve this real interview question? Rising Temperature - Table: Weather +---------------+---------+ | Column Name | Type | +---------------+---------+ | id | int | | recordDate | date | | temperature | int | +---------------+---------+ id is the pr

leetcode.com

이번 퀴즈는 Self Join뿐만 아니라 DATE_ADD()함수까지 곁들인 퀴즈입니다. DATE_ADD()는 SQL에서 날짜를 계산할 수 있는 함수인데요. 간단하게 설명을 해보자면 이렇습니다. 

### MySQL DATE 연산
1. DATE_ADD(기준날짜, INTERVAL)
 - SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND)
 - SELECT DATE_ADD(NOW(), INTERVAL 1 MINUTE)
 - SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR)
 - SELECT DATE_ADD(NOW(), INTERVAL 1 DAY)
 - SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH)
 - SELECT DATE_ADD(NOW(), INTERVAL 1 YEAR)
 - SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR)
 
 2. DATE_SUB(기준날짜, INTERVAL)
 - SELECT DATE_SUB(NOW(), INTERVAL 1 SECOND)

문제를 살펴보겠습니다. 

Input: 
Weather table:
+----+------------+-------------+
| id | recordDate | temperature |
+----+------------+-------------+
| 1  | 2015-01-01 | 10          |
| 2  | 2015-01-02 | 25          |
| 3  | 2015-01-03 | 20          |
| 4  | 2015-01-04 | 30          |
+----+------------+-------------+
Output: 
+----+
| id |
+----+
| 2  |
| 4  |
+----+
Explanation: 
In 2015-01-02, the temperature was higher than the previous day (10 -> 25).
In 2015-01-04, the temperature was higher than the previous day (20 -> 30).

문제를 보니 전날보다 temperature가 높은 recordDate의 id를 표출해보라는 문제입니다. 그렇다면 일단 Self Join을 해봐야 하는데요. 저는 오늘의 날짜, 오늘의 온도, 어제 날짜 어제 온도로 테이블을 만들어보도록하겠습니다. 

select td.id,
       td.recordDate as today_date,  
       td.temperature as today_temp,
       yes.id as yesterday_id,
       yes.recordDate as yesterday_date,
       yes.temperature as yesterday_temp
from Weather as td
join Weather as yes
on DATE_ADD(yes.recordDate, INTERVAL 1 DAY) = td.recordDate
______________________________________________________________
output:
| id | today_date | today_temp | yesterday_id | yesterday_date | yesterday_temp |
| -- | ---------- | ---------- | ------------ | -------------- | -------------- |
| 2  | 2015-01-02 | 25         | 1            | 2015-01-01     | 10             |
| 3  | 2015-01-03 | 20         | 2            | 2015-01-02     | 25             |
| 4  | 2015-01-04 | 30         | 3            | 2015-01-03     | 20             |

네 이렇게 테이블을 만들어봤는데요. 여기서 키포인트는 on에 id를 적용하지 않고 DATE_ADD()함수를 써서 recordDate를 가지고 매칭을 시켰다는 점입니다. 그렇다면 답은 온도가 상승한 날들의 id가 필요한 것이니 쿼리를 작성해보겠습니다.

select td.id
from Weather as td
join Weather as yes
on DATE_ADD(yes.recordDate, INTERVAL 1 DAY) = td.recordDate
where td.temperature > yes.temperature
_____________________________________________________________________
output:
| id |
| -- |
| 2  |
| 4  |

네 이렇게 where절에 td.temperatuer가 yes.temperature보다 높은 id들을 뽑아봤습니다. 

반응형