Search

์œˆ๋„์šฐ ํ•จ์ˆ˜

์œˆ๋„์šฐ ํ•จ์ˆ˜ (Window Function)

ํ–‰์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์ง€ ์•Š๊ณ  ๊ฐ ํ–‰์— ๋Œ€ํ•˜์—ฌ ํ–‰๋ฒˆํ˜ธ, ์ˆœ์œ„, ์ด์ „ ํ–‰, ๋‹ค์Œ ํ–‰ ๋น„๊ต ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜

์œˆ๋„์šฐ ํ•จ์ˆ˜ ๋ฌธ๋ฒ• ๊ตฌ์กฐ

์œˆ๋„์šฐ ํ•จ์ˆ˜ OVER ( PARTITION BY ์ปฌ๋Ÿผ -- ๊ทธ๋ฃน ๊ธฐ์ค€ ORDER BY ์ปฌ๋Ÿผ -- ์ •๋ ฌ ๊ธฐ์ค€ ROWS BETWEEN ... -- ํ”„๋ ˆ์ž„ ์ง€์ • ์˜ต์…˜ )
SQL
๋ณต์‚ฌ

์ฃผ์š” ์œˆ๋„์šฐ ํ•จ์ˆ˜

ํ•จ์ˆ˜ ์ด๋ฆ„
์„ค๋ช…
ROW_NUMBER()
ํŒŒํ‹ฐ์…˜ ๋‚ด ์ˆœ๋ฒˆ ๋ถ€์—ฌ (์ค‘๋ณต ์—†์ด ๊ณ ์œ )
RANK()
๋™์ผ ๊ฐ’์— ๋™์ผ ์ˆœ์œ„, ๋‹ค์Œ ์ˆœ์œ„๋Š” ๊ฑด๋„ˆ๋œ€
DENSE_RANK()
๋™์ผ ๊ฐ’์— ๋™์ผ ์ˆœ์œ„, ๋‹ค์Œ ์ˆœ์œ„๋Š” ๊ฑด๋„ˆ๋›ฐ์ง€ ์•Š์Œ
NTILE(N)
ํŒŒํ‹ฐ์…˜์„ N๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ฒˆํ˜ธ ๋ถ€์—ฌ
LAG(col, n, def)
nํ–‰ ์ด์ „์˜ ๊ฐ’ ๋ฐ˜ํ™˜ (์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’)
LEAD(col, n, def)
nํ–‰ ์ดํ›„์˜ ๊ฐ’ ๋ฐ˜ํ™˜ (์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’)
FIRST_VALUE()
ํŒŒํ‹ฐ์…˜ ๋‚ด ์ฒซ ๋ฒˆ์งธ ๊ฐ’ ๋ฐ˜ํ™˜
LAST_VALUE()
ํŒŒํ‹ฐ์…˜ ๋‚ด ๋งˆ์ง€๋ง‰ ๊ฐ’ ๋ฐ˜ํ™˜
SUM()
๋ˆ„์  ํ•ฉ๊ณ„
AVG()
๋ˆ„์  ํ‰๊ท 
MAX()
๋ˆ„์  ์ตœ๋Œ€๊ฐ’
MIN()
๋ˆ„์  ์ตœ์†Œ๊ฐ’
COUNT()
๋ˆ„์  ๊ฐœ์ˆ˜

ํ”„๋ ˆ์ž„ ์ง€์ • ์˜ต์…˜ ํ‚ค์›Œ๋“œ

ํ‚ค์›Œ๋“œ
์˜๋ฏธ
์˜ˆ์‹œ ์„ค๋ช…
UNBOUNDED PRECEDING
์ฒซ ๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ ์‹œ์ž‘
์ฐฝ์˜ ์‹œ์ž‘ ์ง€์ ์„ ํ…Œ์ด๋ธ” ๋˜๋Š” ํŒŒํ‹ฐ์…˜์˜ ๋งจ ์ฒ˜์Œ ํ–‰์œผ๋กœ ์ง€์ •
n PRECEDING
ํ˜„์žฌ ํ–‰์—์„œ nํ–‰ ์ด์ „๋ถ€ํ„ฐ ์‹œ์ž‘
์˜ˆ: 2 PRECEDING โ†’ ํ˜„์žฌ๋ณด๋‹ค 2ํ–‰ ์•ž์—์„œ ์‹œ์ž‘
CURRENT ROW
ํ˜„์žฌ ํ–‰๋ถ€ํ„ฐ ์‹œ์ž‘ ๋˜๋Š” ๋
์œˆ๋„์šฐ ๊ฒฝ๊ณ„๋ฅผ ํ˜„์žฌ ํ–‰์œผ๋กœ ์ง€์ •
n FOLLOWING
ํ˜„์žฌ ํ–‰์—์„œ nํ–‰ ์ดํ›„๊นŒ์ง€ ํฌํ•จ
์˜ˆ: 1 FOLLOWING โ†’ ํ˜„์žฌ๋ณด๋‹ค 1ํ–‰ ๋’ค๊นŒ์ง€ ํฌํ•จ
UNBOUNDED FOLLOWING
๋งˆ์ง€๋ง‰ ํ–‰๊นŒ์ง€ ํฌํ•จ
์ฐฝ์˜ ๋ ์ง€์ ์„ ํŒŒํ‹ฐ์…˜ ๋˜๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ๋งˆ์ง€๋ง‰ ํ–‰์œผ๋กœ ์ง€์ •

ROW_NUMBER()

๊ฐ ํŒŒํ‹ฐ์…˜๋ณ„ ์ •๋ ฌ ๊ธฐ์ค€์— ๋”ฐ๋ผ ๊ณ ์œ ํ•œ ํ–‰๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ํ•จ์ˆ˜
SELECT emp_no ,name ,dept_no ,salary ,ROW_NUMBER() OVER ( PARTITION BY dept_no ORDER BY salary DESC ) AS '๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ์ˆœ๋ฒˆ' FROM employees;
SQL
๋ณต์‚ฌ

RANK( )

์ค‘๋ณต๋œ ์ˆœ์œ„๋Š” ๊ฑด๋„ˆ๋›ฐ๋Š” ์ˆœ์œ„๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
SELECT emp_no ,name ,dept_no ,salary ,RANK() OVER ( PARTITION BY dept_no ORDER BY salary DESC ) AS '๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ์ˆœ์œ„' FROM employees;
SQL
๋ณต์‚ฌ

DENSE_RANK( )

๊ณต๋™ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ์ค‘๋ณต๋œ ์ˆœ์œ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ์ง€ ์•Š๊ณ  ์ˆœ์œ„๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
SELECT emp_no ,name ,dept_no ,salary ,DENSE_RANK() OVER ( PARTITION BY dept_no ORDER BY salary DESC ) AS '๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ์ˆœ์œ„' FROM employees;
SQL
๋ณต์‚ฌ

NTILE( n )

์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๋ฅผ n๊ฐœ์˜ ๋™์ผํ•œ ํฌ๊ธฐ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ทธ๋ฃน ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ํ•จ์ˆ˜
SELECT emp_no ,name ,salary ,NTILE(4) OVER ( ORDER BY salary DESC ) AS '๊ธ‰์—ฌ ๋ถ„์œ„' FROM employees;
SQL
๋ณต์‚ฌ

LAG( )

ํ˜„์žฌ ํ–‰๋ณด๋‹ค nํ–‰ ์ด์ „ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜
LAG( ์ปฌ๋Ÿผ, nํ–‰, ๊ธฐ๋ณธ๊ฐ’ )
SQL
๋ณต์‚ฌ
์ง€์ •ํ•œ ์ปฌ๋Ÿผ์˜ ํ˜„์žฌ ํ–‰์œผ๋กœ ๋ถ€ํ„ฐ nํ–‰ ์•ž์„  ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
์ด์ „ ํ–‰์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
SELECT emp_no ,name ,salary ,LAG( salary, 1, 0 ) OVER (ORDER BY emp_no) AS '1ํ–‰ ์ด์ „ ์‚ฌ์› ๊ธ‰์—ฌ' FROM employees;
SQL
๋ณต์‚ฌ

LEAD( )

ํ˜„์žฌ ํ–‰๋ณด๋‹ค nํ–‰ ๋‹ค์Œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜
LEAD( ์ปฌ๋Ÿผ, nํ–‰, ๊ธฐ๋ณธ๊ฐ’ )
SQL
๋ณต์‚ฌ
์ง€์ •ํ•œ ์ปฌ๋Ÿผ์˜ ํ˜„์žฌ ํ–‰์œผ๋กœ ๋ถ€ํ„ฐ nํ–‰ ๋’ค์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
๋‹ค์Œ ํ–‰์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
SELECT emp_no ,name ,salary ,LEAD( salary, 1, 0 ) OVER (ORDER BY emp_no) AS '1ํ–‰ ๋‹ค์Œ ์‚ฌ์› ๊ธ‰์—ฌ' FROM employees;
SQL
๋ณต์‚ฌ

FIRST_VALUE()

์œˆ๋„์šฐ ๋‚ด์˜ ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
SELECT emp_no ,name ,salary ,dept_no ,FIRST_VALUE(salary) OVER ( PARTITION BY dept_no ORDER BY emp_no ) AS '์ฒซ๋ฒˆ์งธ ์‚ฌ์›์˜ ๊ธ‰์—ฌ' FROM employees;
SQL
๋ณต์‚ฌ

LAST_VALUE()

์œˆ๋„์šฐ ๋‚ด์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
SELECT emp_no ,name ,salary ,dept_no ,LAST_VALUE(salary) OVER ( PARTITION BY dept_no ORDER BY emp_no ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS '๋งˆ์ง€๋ง‰ ์‚ฌ์›์˜ ๊ธ‰์—ฌ' FROM employees;
SQL
๋ณต์‚ฌ

SUM(), AVG(), MIN(), MAX(), COUNT()

์œˆ๋„์šฐ ํ”„๋ ˆ์ž„ ๋‚ด์—์„œ ์ง‘๊ณ„๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
SELECT emp_no ,name ,salary ,dept_no ,SUM(salary) OVER ( PARTITION BY dept_no ORDER BY salary ASC ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS '1ํ–‰ ์•ž๋’ค ํ•ฉ๊ณ„' ,AVG(salary) OVER ( PARTITION BY dept_no ORDER BY salary ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS '์ฒซํ–‰~ํ˜„์žฌํ–‰ ํ‰๊ท ' FROM employees;
SQL
๋ณต์‚ฌ