문제
어제보다 높은 기온을 갖는 날의 ID를 출력하기
테이블
[Weather]
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| recordDate | date |
| temperature | int |
+---------------+---------+
id is the column with unique values for this table.
There are no different rows with the same recordDate.
This table contains information about the temperature on a certain day.
[예제]
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 |
+----+
풀이1. - DATEDIFF
DATEDIFF를 사용해서 날짜의 차이를 계산한다.
DATEDIFF
날짜의 차이를 계산한다. 구조는 다음과 같다. DATEDIFF('구분자',시작일, 종료일)
구분자 | 약어 | |
년 | YEAR | YY,YYYY |
월 | MONTH | MM,M |
일 | DAY | DD,D |
시 | HOUR | HH |
분 | MINUTE | MI,N |
초 | SECOND | SS,S |
밀리초 | MILLISECOND | MS |
주 | WEEK | WK,WW |
분기 | QUARTER | QQ,Q |
코드
SELECT w1.id
FROM Weather w1 JOIN Weather w2
ON DATEDIFF(w1.recordDate, w2.recordDate) = 1
WHERE w1.temperature > w2.temperature;
+) DATE_ADD, DATE_SUB
기본 구조는 DATE_ADD(기준 날짜, INTERVAL) 이다. 참고로 뺴고싶으면 DATE_SUB를 사용한다.
풀이2. LAG와 WITH AS, DATE_ADD 사용하기
OVER
아래 사용할 LAG, LEAD를 위해 OVER에 대해서 짚고 넘어간다.
OVER는 언제쓰는가? 각 행별로 특정 기준에 따라 함수를 적용하고 싶을 때 쓴다고 한다. OVER 절은 행의 범위를 지정해준다고한다.
기본 구조는 이러하다. [집계함수] OVER(ORDER BY [A]) OVER 안에는 ORDER BY 와 PARTITION BY 가 사용되는데 각각을 알아보면
- ORDER BY: 행 집합을 정의하는 기준
- PARTITION BY: 어떤 칼럼의 값을 기준으로 행 집합을 나눌 지 정의
둘은 같이 사용 가능하다.
LAG & LEAD
값을 특정 칸씩 뒤로 밀거나 앞으로 당겨오는 함수이다.
기본 구조는 LAG(column,diff,null대체) over (order by column) (LEAD도 동일하다.)이다.
그룹마다 함수를 다르게 적용하고자 한다면 PARTITION BY를 적용 가능하다.
WITH AS
with as 를 사용해서 서브쿼리를 사용한다. 기본 구조는 with 이름 as (서브쿼리)로 사용가능하며, 여러개의 사용도 가능하다.
다만 여러개 사용 시 with은 맨 처음 1회만 사용하며 , 를 사용해서 구분해서 추가한다.
코드
WITH pre_Weather AS
(
SELECT
id,recordDate, Temperature,
LAG(temperature,1) OVER (ORDER BY recordDate) AS pre_temp,
LAG(recordDate,1) OVER (ORDER BY recordDate) AS pre_record
FROM
Weather
)
SELECT
id
FROM pre_Weather
WHERE temperature > pre_temp
AND recordDate = DATE_ADD(pre_record, INTERVAL 1 DAY);
참고 및 출처
- 문제 : https://leetcode.com/problems/rising-temperature/
- 풀이 : https://github.com/poriz/leetcode/blob/main/0197-rising-temperature/0197-rising-temperature.sql
leetcode/0197-rising-temperature/0197-rising-temperature.sql at main · poriz/leetcode
Collection of LeetCode questions to ace the coding interview! - Created using [LeetHub v3](https://github.com/raphaelheinz/LeetHub-3.0) - poriz/leetcode
github.com
- OVER : https://velog.io/@wltn716/SQL-Over-%EC%A0%88
SQL OVER 절
드디어 over, partition by절 이해하고 적용해본 기념으로 쓰는 글! 실제로 내용을 이해했던 흐름으로 작성해보자!물품 A의 재고관리를 위해 다음과 같은 테이블 "창고"가 있다고 가정해 보자.위 테이
velog.io
- LAG & LEAD : https://minor-research.tistory.com/64
sql lag, lead 함수로 이전행과 다음행 조회하기
lag, lead라는 영어 단어의 뜻 그대로 이전 또는 이후 행의 데이터를 현재의 행과 함께 조회할 수 있는 기능을 제공하는 함수이다. 대부분 sql db에서 지원하는 기능이면 본문에서는 Postgresql을 기준
minor-research.tistory.com
- DATE_ADD & DATE_SUB : https://extbrain.tistory.com/58
[MySQL] 시간 더하기, 빼기 (DATE_ADD, DATE_SUB 함수)
▶MySQL 시간 더하기, 빼기 (DATE_ADD, DATE_SUB 함수) ▶설명 MySQL에서 특정 시간을 기준으로 더하거나, 빼야 하는 경우가 있습니다.이 때 사용하는 함수가 DATE_ADD와 DATE_SUB입니다.DATE_ADD는 기준 날짜에
extbrain.tistory.com
- WITH AS : https://freehoon.tistory.com/188
[DB] WITH AS 문 사용하기
쿼리를 작성할때 과도한 서브 쿼리는 메인 쿼리의 더욱 복작하게 만든다. 이럴때 WITH AS 구문을 사용하면 그나마 복잡한 부분의 쿼리를 분리해 낼 수 있을 뿐만 아니라 반복적으로 쓰이는 서브
freehoon.tistory.com
'코딩테스트 > SQL' 카테고리의 다른 글
SQL > leetcode 1661. Average Time of Process per Machine (MySQL) (0) | 2024.05.24 |
---|---|
SQL > leetcode 1280. Students and Examinations (MySQL) (0) | 2024.05.23 |
SQL - 트랜잭션, SQL 문법들 (0) | 2024.03.15 |
SQL - Aggregate, CTAS, Join (0) | 2024.03.15 |
SQL - Select (1) | 2024.03.15 |