SUM(~) OVER (ORDER BY ~)
엘레베이터에 차례(Turn)대로 탔을 때 1000kg가 넘지 않는 조건에서 누구까지 탈 수 있는지 구하는 문제였다.
[정답]
SELECT person_name
FROM (
SELECT person_name,
weight,
turn,
SUM(weight) over (order by turn) as total
FROM Queue
)a
WHERE total <= 1000
ORDER BY total DESC
LIMIT 1
SUM, AVG 뒤에 OVER(ORDER BY ~)를 붙이면 누적 합계, 누적 평균을 행 단위로 구할 수 있다.
AVG/SUM(~) OVER (ORDER BY ~ ROWS BETWEEN n PRECEDING AND CURRENT ROW)
- 오늘 날짜 기준으로 지난 7일간의 매출 합계, 평균 구하기
[정답]
# Write your MySQL query statement below
WITH cte AS ( -- 1.일자별 매출 구하기
SELECT visited_on,
SUM(amount) AS daily_amount
FROM customer
GROUP BY visited_on
)
-- 2.지난 7일 간의 매출 합계 및 평균 구하기
SELECT visited_on,
SUM(daily_amount) OVER (ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS amount,
ROUND(AVG(daily_amount) OVER(ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW), 2) AS average_amount
FROM cte
LIMIT 1000 OFFSET 6 -- LIMIT은 아무 큰 숫자 설정, OFFSET = 시작행
SUM/AVG(~) OVER (ORDER BY~)에서 괄호 안의 '(ORDER BY ~)' 부분을 보자.
ORDER BY visited_on ROWS BETWEEN n PRECEDING AND CURRENT ROW : 6번째 앞 행부터 현재 행까지의 합을 구한다. 근데 그 6번째 앞의 기준은 visited on 기준으로 정렬했을 때.
'SQL' 카테고리의 다른 글
[Leetcode] 중복ID 제거(DELETE) (0) | 2024.06.08 |
---|---|
[Leetcode] IFNULL, JOIN 다중조건 (0) | 2024.05.25 |
[Leetcode] LEAD, LAG (0) | 2024.05.21 |
[프로그래머스] SQL 반복문, WITH RECURSIVE (0) | 2024.05.21 |
[Leetcode] CROSS JOIN (0) | 2024.05.21 |