반응형
Notice
Recent Posts
Recent Comments
Link
개발은 처음이라 개발새발
MySQL DATE_ADD & Self Join 퀴즈2 [LeetCode] 본문
반응형
https://leetcode.com/problems/rising-temperature/
이번 퀴즈는 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들을 뽑아봤습니다.
반응형
'mysql' 카테고리의 다른 글
INSERT, UPDATE, DELETE 간단 정리 (0) | 2023.05.27 |
---|---|
MySQL Union 퀴즈 [해커랭크] (0) | 2023.05.21 |
Self Join 퀴즈 풀어보기 [LeetCode] (0) | 2023.05.07 |
Left Join 퀴즈 풀어보기 [LeetCode] (3) | 2023.05.06 |
JOIN을 이용해 대륙별 평균 도시의 인구수를 구하라 [해커랭크] (0) | 2023.05.01 |