목차
SELF JOIN & DATE type format에 대해 알아보기 위해 SQL 문제 사이트인 리트코드에서 https://leetcode.com/problems/rising-temperature/ 요문제를 풀어보자. SELF JOIN에 대한 다른 포스팅은 여기로 가면 된다.
얘가 요구하는걸 보면, 전날 온도보다 더 높은 온도를 가진 아이디를 뽑아라이다.
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 |
+----+------------+-------------+
여기서 전날의 온도와 비교를 하려면 SELF JOIN을 해야되는데 .. 그냥 셀프 조인하면 걍 옆에 붙는데요 전날이랑 어케 연결하죠?ㅋㅋ 이걸 으떻게 하느냐? 바로 -> INNER JOIN WEATHER AS YESTERDAY ON YESTERDAY.(ID+1) = TODAY.ID요렇게 하면 된다. (SELF JOIN을 할 땐 명칭을 다르게 하는게 구분할때 좋다. 난 머리 좋아서 안 헷갈리는데요ㅋㅋ 이러지마로 걍.. 하는거 추천요.)
SELECT *
FROM WEATHER AS TODAY
INNER JOIN WEATHER AS YESTERDAY ON YESTERDAY.(ID+1) = TODAY.ID
이렇게 선언하면 결과값으로 아래와 같이 나오는데, 빨간색 볼드체로 된 것이 현재 그리고 그 오른쪽이 어제의 날씨가 이너조인이 된 상태라고 보면 된다.
| id | recordDate | temperature | id | recordDate | temperature |
| -- | ---------- | ----------- | -- | ---------- | ----------- |
| 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 |
이제 저기에다가 where절로 today.tmp > yesterday.tmp 를 선언하고 id 출력하면 된다.
| id | recordDate | temperature | id | recordDate | temperature |
| -- | ---------- | ----------- | -- | ---------- | ----------- |
| 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 |
그럼 이렇게 나오고?ㅋㅋ id가 2,4 나오것지? 역시난 천재야ㅋㅋㅋㅋ 하고 submit을 누르면? 틀린다.
왜냐 id가 날짜랑 정비례, 1:1대응 된다고 된다는 전제가 없기 때문에.. 출제자가 테스트케이스에.. 숨겨놓은것
믜.칑.것.
DATE format 관련 함수
- DATE format 더하기 함수 : SELECT DATE_ADD(NOW(), INTERVAL 1 ___)
___에 들어갈 수 있는건 SECOND, MINUTE, HOUR, DAY, MONTH,YEAR가 있다. 1대신 다른 숫자 넣으면 이틀 추가 두시간 추가 , 음수 넣으면 빼지기도함.. sub함수도 있다. 편한거 쓰면 된다.
- DATE format 빼기 함수 : SELECT DATE_SUB(NOW(), INTERVAL 1 ___)
___에 들어갈 수 있는건 ADD함수와 같이 SECOND, MINUTE, HOUR, DAY, MONTH,YEAR가 있다. 역시 숫자 말고 ㅇㅋ하면됨.
DATE type format 함수를 이용한 문제 풀이
SELECT TODAY.ID
FROM WEATHER AS TODAY
INNER JOIN WEATHER AS YESTERDAY ON DATE_ADD(YESTERDAY.RECORDDATE,INTERVAL 1 DAY) = TODAY.RECORDDATE
WHERE TODAY.TEMPERATURE > YESTERDAY.TEMPERATURE
결론적으로 위와 같이 적는 것이 본 문제의 정답이 된다.
혹시 "즈는 SUB에다가 음수 처넣어서 양수로 더하기 만들건데요." 라고 생각하는 사람이 있으쉰지..?ㅋㅋ 사실 이거 저임ㅋㅋ 아니 궁금하자나요.. 되는지 안되는지 확인은 할 수 있는거 아닌가요.
해본 결과 잘 돌아간다. 님들은 이런 뻘짓하지 마시고 그냥 ADD 쓰세요. 그냥 해본거임 궁금해서요. 저도 ADD함수 쓸겁니다. 이상으로 [MySQL] SQL SELF JOIN & DATE format type 포스팅을 마칩니다. 즐거운 SQL 허시길.
'IT, Computer' 카테고리의 다른 글
티스토리 블로그 애드센스 수익 여정 포스팅 (3) ads.txt 문제를 해결 해보자 (0) | 2024.06.02 |
---|---|
티스토리 블로그 애드센스 수익 여정 포스팅 (2) 애드센스 일부 내용을 수정해야 합니다 (1) | 2024.05.30 |
[MySQL] SELF JOIN에 대해 알아보자 (0) | 2024.05.27 |
[MySQL] 소수점 처리 하는 방법 (0) | 2024.05.26 |
티스토리 블로그 애드센스 수익 여정 포스팅 (1) (7) | 2024.05.20 |