leetcode : 180. Consecutive Numbers
다이어그램
erDiagram
LOGS {
int id pk
varchar num
}
목표
Find
all numbers that appear at least three times consecutively.
Return the result table in any order.연속 3개 이상 나오는 숫자들 구하기
ID는 AUTO INC
문제 풀이
MySQL
-- SOLUTION 1
WITH TEMP AS (
SELECT
ID, NUM,
MIN(NUM) OVER (ORDER BY ID ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS MIN_WINDOW,
MAX(NUM) OVER (ORDER BY ID ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS MAX_WINDOW,
COUNT(NUM) OVER (ORDER BY ID ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS CNT
FROM LOGS
)
SELECT DISTINCT(NUM) AS ConsecutiveNums
FROM TEMP
WHERE min_window = max_window AND CNT >= 3;
-- SOLUTION 2
WITH TEMP AS (
SELECT
ID, NUM,
LAG(NUM, 1) OVER (ORDER BY ID) AS PREV_NUM,
LEAD(NUM, 1) OVER (ORDER BY ID) AS NEXT_NUM
FROM LOGS
)
SELECT DISTINCT NUM AS ConsecutiveNums
FROM TEMP
WHERE NUM = PREV_NUM AND NUM = NEXT_NUM;
- SOLUTION 1 : WINDOW + MIN/MAX
- 크기 3 윈도우에서 MIN MAX값이 같고, 크기 3이 만족이 되면 (테이블 양 끝쪽이 아니면) 출력하기.
- SOLUTION 2 : LEAD / LAG
- LEAD LAG로로 주변 값 1개씩 비교하기.
Pandas
# SOLUTION 1
def consecutive_numbers(logs: pd.DataFrame) -> pd.DataFrame:
logs['window_max'] = logs['num'].rolling(window=3).max()
logs['window_min'] = logs['num'].rolling(window=3).min()
cond1 = logs['window_min'] == logs['window_max']
return logs[cond1][['num']].drop_duplicates('num').rename(columns={'num':'ConsecutiveNums'})
# SOLUTION 2
def consecutive_numbers(logs: pd.DataFrame) -> pd.DataFrame:
logs['prev_num'] = logs['num'].shift(1)
logs['next_num'] = logs['num'].shift(-1)
cond1 = logs['num']==logs['prev_num']
cond2 = logs['num']==logs['next_num']
return logs[cond1&cond2][['num']].drop_duplicates('num').rename(columns={'num':'ConsecutiveNums'})
- SOLUTION 1 : rolling + min/max
- 크기 3 윈도우에서 MIN MAX값이 같고, 크기 3이 만족이 되면 (테이블 양 끝쪽이 아니면) 출력하기.
- SOLUTION 2 : shift
- shift가 양수면 위에서 아래로 푸시 해줘서 값이 밀려나는 것으로 생각하면 된다.
- shift(1)이면 첫 줄에는 none
코멘트
- 윈도우 함수 정리하기!
'Data Analysis > Query' 카테고리의 다른 글
leetcode : 184. Department Highest Salary (0) | 2024.12.31 |
---|---|
leetcode : 183. Customers Who Never Order (0) | 2024.12.30 |
leetcode : 182. Duplicate Emails (0) | 2024.12.30 |
leetcode : 178. Rank Scores (0) | 2024.12.29 |
leetcode : 177. Nth Highest Salary (0) | 2024.12.28 |
leetcode : 176. Second Highest Salary (0) | 2024.12.28 |
leetcode : 181. Employees Earning More Than Their Managers (0) | 2024.12.27 |
댓글