๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ฐœ๋ฐœ์ด์•ผ๊ธฐ

[Mysql] row_number() ๊ทธ๋ฃน๋ณ„ ํ–‰๋ฒˆํ˜ธ ์ถœ๋ ฅ ์ฟผ๋ฆฌ

๋ฐ˜์‘ํ˜•

๊ทธ๋ฃน๋ณ„ ์ˆœ์„œ ์ถœ๋ ฅ ์ฟผ๋ฆฌ Mysql row_number()

mysql 8 ๋ฒ„์ „ ์ด์ƒ์—์„œ๋Š” row_number() ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•œ๋‹ค.

์™€.. ๊ฐœ์ฉ”์–ด. ์˜›๋‚  ์˜›์ ์—๋Š” row_number() ํ•จ์ˆ˜๊ฐ€ ์—†์–ด์„œ ์ฟผ๋ฆฌ ๊ธธ์ด๋Š” ๋ฌด์Ÿˆ๊ฒŒ ๊ธธ๊ณ , ์„ฑ๋Šฅ๋„ ๊ตฌ๋ ค์„œ ๊ฑ ์ฝ”๋“œ๋กœ ๋•Œ๋ ค ๋ฐ•์•˜๋˜..

์˜ค๋ผํด ๋ณด๊ณ  ์นจ ํ˜๋ฆฌ๋˜ ์‹œ์ ˆ์ด ์žˆ์—ˆ๋Š”๋ฐ.. ใ…Ž


๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์€ ์š”๋กœ์ผ€ ์“ฐ๊ณ , 

ROW_NUMBER() OVER (<partition_definition> <order_definition>)

<partition_definition> : PARTITION BY <expression>,[{,<expression>}...]
์ด ๋ถ€๋ถ„์€ ํŠน์ • ์ปฌ๋Ÿผ์ด๋‚˜ ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃน์ง€์–ด ์ˆœ๋ฒˆ์„ ๋งค๊ฒจ์ค€๋‹ค. group_by์™€ ๊ฐ™๋‹ค๊ณ  ๋ณด๋ฉด ๋จ.

ํ•˜๋‚˜๋งŒ ์“ธ ์ˆ˜ ์žˆ๋Š”๊ฑด ์•„๋‹ˆ๊ณ , ์ฝค๋งˆ(,)๋กœ ์—ฌ๋Ÿฌ๊ฐœ ์ง€์ •์ด ๊ฐ€๋Šฅ.

๊ตณ์ด ๋„ฃ์„ ํ•„์š” ์—†๋‹ค๋ฉด ์•ˆ๋„ฃ์–ด๋„ ์ƒ๊ด€์—†์Œ.


<order_definition> : ORDER BY <expression> [ASC|DESC],[{,<expression>}...]
์ˆœ๋ฒˆ์„ ๋งค๊ธธ ๋•Œ, ํŠน์ • ์ปฌ๋Ÿผ ๊ธฐ์ค€์œผ๋กœ ์ˆœ๋ฒˆ์„ ๋งค๊ธธ ์ˆ˜ ์žˆ๋‹ค. 


๊ฐ€์žฅ ๊ธฐ๋ณธ ์ ์ธ ์‚ฌ์šฉ๋ฒ•๋ถ€ํ„ฐ

1. ์ˆœ๋ฒˆ ๋งค๊ธฐ๊ธฐ

SELECT 
ROW_NUMBER() OVER ( ORDER BY group_no ) row_num,
    group_no,
    name,
use_yn,
    from_unixtime(reg_date) as reg_date
FROM 
test
ORDER BY 
group_no;


test ํ…Œ์ด๋ธ”์˜ group_no ๊ธฐ์ค€์œผ๋กœ ์ˆœ๋ฒˆ์„ ๋งค๊ธฐ๊ณ  ์‹ถ๋‹ค๋Š” ๋‚ด์šฉ


2. ๊ทธ๋ฃน๋ณ„ ์ˆœ๋ฒˆ ๋งค๊ธฐ๊ธฐ
ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์€๊ฑด, group_no ๊ธฐ์ค€์œผ๋กœ, group_no ๋ณ„๋กœ ์ˆœ๋ฒˆ์„ ๋งค๊ธฐ๊ณ  ์‹ถ๋‹ค.
์ด๋Ÿด ๋•Œ partition์„ ์ •์˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
group_no ์ปฌ๋Ÿผ ๊ธฐ์ค€์œผ๋กœ ์ˆœ๋ฒˆ์„ ๋งค๊ฒจ์ค€๋‹ค. 

SELECT 
ROW_NUMBER() OVER ( partition by group_no ORDER BY group_no ) row_num,
    group_no,
    name,
use_yn,
    from_unixtime(reg_date) as reg_date
FROM 
test
ORDER BY 
group_no;



3. ๊ทธ๋ฃน๋ณ„ ์ˆœ๋ฒˆ ๋งค๊ธฐ๊ธฐ - ์กฐ๊ฑด ํฌํ•จ
๋ฌถ์Œ ๋‹จ์œ„๋กœ ์ˆœ๋ฒˆ์„ ๋งค๊ธฐ๋˜,  ํŠน์ • ์ปฌ๋Ÿผ ๊ฐ’์ด null์ด๊ฑฐ๋‚˜ ์กฐ๊ฑด์— ๋งž์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ˆœ๋ฒˆ์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋งค๊ฒจ์คซ์œผ๋ฉด ์ข‹๊ฒ ์Œ.

[ 1, 2, null ] ๋˜๋Š” [ null, 1, 2 ] ๋˜๋Š” [ 1, null, 2] 

์ด๋Ÿฐ์‹์œผ๋กœ ์ถœ๋ ฅ ๋˜๊ธธ ์›ํ•จ

SELECT 
(case when use_yn = 'Y' then
ROW_NUMBER() OVER ( partition by group_no, 
(case when use_yn = 'Y' then 1 else 0 end) ORDER BY group_no )
END ) as row_num,
    group_no,
    name,
    use_yn,
    from_unixtime(reg_date) as reg_date
FROM 
test
ORDER BY 
group_no;


์งœ๋ผ๋ž€.. ์—ญ์‹œ. ๋ฐฐ์›€์€ ๋์ด ์—†๋Š๋‹ˆ๋ผ ใ…Ž
๋งŽ์ด ์ข‹์•„์กŒ๋‹ค mysql!