SQL

[Leetcode] SUM/AVG() OVER (ORDER BY ~ ROWS ~)

DAdiary 2024. 5. 21. 12:04

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일간의 매출 합계, 평균 구하기

1321. Restaurant Growth

 

[정답]

# 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