Tools/- SQL

[SQL] ๐Ÿ“Œ window ํ•จ์ˆ˜ range/rows between ์•Œ์•„๋ณด๊ธฐ | leetcode | 1321. Restaurant Growth ์˜ˆ์ œ ํ’€์ด

์Šค์œ„๋ฏผ 2025. 1. 24. 18:43

Windw ํ•จ์ˆ˜ : Range/Rows between

 

์œˆ๋„์šฐ ํ•จ์ˆ˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ํ–‰๊ฐ„์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ–‰ ๊ฐ„์˜ sum์„ ๊ตฌํ•  ๋•Œ, [5๊ฐœ ์ด์ „ํ–‰~ํ˜„์žฌํ–‰] ์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌผ๋ก , ๊ทธ ๋ฒ”์œ„๋Š” ์ž์œ ๋กญ๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Range/Rows between ๋ฌธ๋ฒ•

 

  • ํ•จ์ˆ˜ over ( ~ range/rows between [๋ฒ”์œ„ 1] and [๋ฒ”์œ„ 2] )

[๋‹จ์œ„ ์ง€์ •]

ROWS BETWEEN : ๋ฌผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ํ–‰ ์ง‘ํ•ฉ์„ ์ง€์ •, order by์— ๊ฐ™์€ ๊ฐ’์ด ์žˆ์–ด๋„ ๋ณ„๊ฐœ์˜ ํ–‰์œผ๋กœ ์ทจ๊ธ‰
RANGE BETWEEN : ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ์˜ํ•ด ํ–‰ ์ง‘ํ•ฉ์„ ์ง€์ •, order by์— ๊ฐ™์€ ๊ฐ’์ด ์žˆ์œผ๋ฉด ํ•˜๋‚˜์˜ ํ–‰์œผ๋กœ ์ทจ๊ธ‰

 

[๋ฒ”์œ„ ์ง€์ •]
UNBOUNDED PRECEDING : ์œˆ๋„์šฐ ์‹œ์ž‘ ์œ„์น˜๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋กœ์šฐ์ž„์„ ์˜๋ฏธ 
UNBOUNDED FOLLOWING : ์œˆ๋„์šฐ ๋งˆ์ง€๋ง‰ ์œ„์น˜๊ฐ€ ๋งˆ์ง€๋ง‰ ๋กœ์šฐ์ž„์„ ์˜๋ฏธ 
[ROW์ˆ˜] PRECEDING : ์œˆ๋„์šฐ ์‹œ์ž‘ ์œ„์น˜๊ฐ€ ROW์ˆ˜๋งŒํผ ์ด์ „์ด ์‹œ์ž‘ ๋กœ์šฐ์ž„์„ ์˜๋ฏธ (ex. 6 preceding)
[ROW์ˆ˜] FOLLOWING : ์œˆ๋„์šฐ ๋งˆ์ง€๋ง‰ ์œ„์น˜๊ฐ€ ROW์ˆ˜๋งŒํผ ๋‹ค์Œ์ด ๋งˆ์ง€๋ง‰ ๋กœ์šฐ์ž„์„ ์˜๋ฏธ (ex. 6 following)
CURRENT ROW : ํ˜„์žฌ ๋กœ์šฐ๊นŒ์ง€๋ฅผ ์˜๋ฏธ

INTERVAL N [์‹œ๊ฐ„๋‹จ์œ„] PRECEDING/FOLLOWING
: range์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•œ๋‹ค. (์•„๋ž˜ ์˜ˆ์ œ์—์„œ ํ™œ์šฉ ๋ฐฉ๋ฒ•์„ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ๋‹ค)

 

โš ๏ธ ์—ฌ๊ธฐ์„œ ํ•ญ์ƒ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฒƒ

- 6 preceding (O)   6 row preceding (X)  :  ์ˆซ์ž๋งŒ !

- interval 6 day preceding (O)  interval 6 days preceding (X)  : ๋‹จ์œ„์— -s(๋ณต์ˆ˜ํ˜•) ์•ˆ๋ถ™์ž„ !

 

 

๋ฌธ์ œ

 

https://leetcode.com/problems/restaurant-growth/

 

์ฟผ๋ฆฌ ๋‹ต์•ˆ

 

๋‚˜์˜ ๋งค์šฐ ์ง๊ด€์ ์ธ ๋‹ต์•ˆ

with result as (
select
    visited_on,
    amount,
    lag(amount, 1) over (order by visited_on) as a,
    lag(amount, 2) over (order by visited_on) as b,
    lag(amount, 3) over (order by visited_on) as c,
    lag(amount, 4) over (order by visited_on) as d,
    lag(amount, 5) over (order by visited_on) as e,
    lag(amount, 6) over (order by visited_on) as f
from (select visited_on, sum(amount) as amount from customer group by visited_on) as t
)

select visited_on,
    (amount + a + b + c + d + e + f) as amount,
    round((amount + a + b + c + d + e + f) / 7, 2) as average_amount
from result
where visited_on between '2019-01-07' and '2019-01-10'

-- 12๋ถ„

 

ํƒ€ ๋ธ”๋กœ๊ทธ ํ’€์ด

with result_table as
(SELECT VISITED_ON
	, SUM(AMOUNT) OVER(ORDER BY VISITED_ON RANGE BETWEEN INTERVAL 6 DAY PRECEDING AND CURRENT ROW) AS 'AMOUNT'
	, ROUND(SUM(AMOUNT) OVER(ORDER BY VISITED_ON RANGE BETWEEN INTERVAL 6 DAY PRECEDING AND CURRENT ROW) / 7, 2) AS 'AVERAGE_AMOUNT'
FROM (SELECT VISITED_ON
		, SUM(AMOUNT) AMOUNT
	FROM CUSTOMER
	GROUP BY VISITED_ON) as t)
    
select *
from result_table
WHERE VISITED_ON >= (SELECT MIN(VISITED_ON) FROM CUSTOMER) + 6 -- ์ง์ ‘ ๋‚ ์งœ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ ์ตœ์†Œ ๋‚ ์งœ+6์œผ๋กœ ์ง€์ •
-- ํ•œ ํ…Œ์ด๋ธ” ์•ˆ์— where์ ˆ๋กœ visited_on์— ์กฐ๊ฑด์„ ๊ฑธ์–ด๋ฒ„๋ฆฌ๋ฉด ์ด์ „ ๋‚ ์งœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค
ORDER BY VISITED_ON ASC

 

 

๋ฌธ์ œ ํ’€์ด

 

interval [๋‚ ์งœ ์ˆ˜] day๋ฅผ ์‚ฌ์šฉํ•ด์„œ 6์ผ ์ด์ „ ~ ํ˜„์žฌ๊นŒ์ง€์˜ ๋‚ ์งœ ๊ฐ„๊ฒฉ์„ ๋ฒ”์œ„๋กœ ์ง€์ •ํ•œ๋‹ค.

sum / avg ๋ฅผ ์‚ฌ์šฉํ•ด์„œ 6์ผ ์ด์ „ ~ ํ˜„์žฌ๊นŒ์ง€์˜ ์ด๋™ํ•ฉ / ์ด๋™ํ‰๊ท ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค!

 

select visited_on,
       amount,
       sum(amount) over (order by visited_on range between interval 6 day preceding and current row) as 'amount'
from (select visited_on, sum(amount) as amount from customer group by visited_on) as t

 

2019-01-01 ~ 2019-01-01 

2019-01-01 ~ 2019-01-02

2019-01-01 ~ 2019-01-03

2019-01-01 ~ 2019-01-04

2019-01-01 ~ 2019-01-05

2019-01-01 ~ 2019-01-06

2019-01-01 ~ 2019-01-07 -- ์—ฌ๊ธฐ๋ถ€ํ„ฐ 7๊ฐœํ–‰ ํ•ฉ ๊ตฌํ•ด์ง

2019-01-02 ~ 2019-01-08

2019-01-03 ~ 2019-01-09

2019-01-04~ 2019-01-10

 

์ด๋ ‡๊ฒŒ ๋‚ ์งœ ๋ฒ”์œ„๋กœ ํ•ฉ์ด ๊ตฌํ•ด์ง„ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๋А๋‚€ ์ 

 

์ •๋ง ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์€ ๋๋„ ์—†์ด ๋‚˜์˜ค๋Š”๊ตฌ๋‚˜ ~~

์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค !