
- ๐ PARTITION BY
- 1๏ธโฃ PARTITION BY๋?
- 2๏ธโฃ PARTITION BY ์์ด ROW_NUMBER() ์ฌ์ฉํ๋ฉด?
- 3๏ธโฃ PARTITION BY๋ฅผ ์ฌ์ฉํ๋ฉด?
- 4๏ธโฃ PARTITION BY๋ฅผ ์ ์ฐ๋์?
- ROW_NUMBER()์ PARTITION BY๋ฅผ ํ์ฉํ ๋ฐ์ดํฐ ๊ทธ๋ฃนํ ๋ฐ ์ ๋ ฌ
- 1๏ธโฃ SQL ์ฝ๋ ๋ถ์
- ๐ ์ฝ๋ ํด์
- 2๏ธโฃ ์์ ๋ฐ์ดํฐ
- 3๏ธโฃ SQL ์คํ ๊ฒฐ๊ณผ
- 4๏ธโฃ ๊ฒฐ๊ณผ ๋ถ์
- 5๏ธโฃ ํ์ฉ ์ฌ๋ก
- โ 1. ๊ฐ ๊ทธ๋ฃน๋ณ ์ต์ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
- โ 2. ์ค๋ณต ๋ฐ์ดํฐ ์ ๋ฆฌ
- 6๏ธโฃ ์ ๋ฆฌ
๐ PARTITION BY
1๏ธโฃ PARTITION BY๋?
PARTITION BY๋ ํ๋์ ํ
์ด๋ธ์ ํน์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃน(ํํฐ์
)์ผ๋ก ๋๋๋ ๊ธฐ๋ฅ์
๋๋ค.
์์
๋ก ์น๋ฉด, ํํฐ(Filter)๋ฅผ ์ ์ฉํ์ฌ ๊ทธ๋ฃน๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค.
2๏ธโฃ PARTITION BY ์์ด ROW_NUMBER() ์ฌ์ฉํ๋ฉด?
์ฌ์๋ฒํธ ๋ถ์ ์ ์ฌ์ผ
1001 | ์์ | 2023-03-01 |
1002 | ์์ | 2022-08-15 |
1003 | IT | 2021-06-10 |
1004 | IT | 2023-05-20 |
1005 | IT | 2019-12-01 |
๋ง์ฝ ROW_NUMBER()๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌ์ผ์ด ๋น ๋ฅธ ์์๋๋ก ์ผ๋ จ๋ฒํธ๋ฅผ ๋ถ์ฌํ๋ฉด, ์๋์ฒ๋ผ ์ ์ฒด ๋ฐ์ดํฐ์ ๋ํด ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง๋๋ค.
SELECT
์ฌ์๋ฒํธ, ๋ถ์, ์
์ฌ์ผ,
ROW_NUMBER() OVER(ORDER BY ์
์ฌ์ผ ASC) AS ์๋ฒ
FROM ์ง์ํ
์ด๋ธ;
๐ฝ ๊ฒฐ๊ณผ (๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ณด๊ณ ์๋ฒ ๋ถ์ฌ)
์ฌ์๋ฒํธ ๋ถ์ ์ ์ฌ์ผ ์๋ฒ
1005 | IT | 2019-12-01 | 1 |
1003 | IT | 2021-06-10 | 2 |
1002 | ์์ | 2022-08-15 | 3 |
1001 | ์์ | 2023-03-01 | 4 |
1004 | IT | 2023-05-20 | 5 |
โก ๋ถ์๋ณ ๊ทธ๋ฃน์ด ์์ด ์ ์ฒด ๋ฐ์ดํฐ๊ฐ ํ๋๋ก ์ ๋ ฌ๋์์
3๏ธโฃ PARTITION BY๋ฅผ ์ฌ์ฉํ๋ฉด?
์ด๋ฒ์๋ PARTITION BY ๋ถ์๋ฅผ ์ถ๊ฐ
SELECT
์ฌ์๋ฒํธ, ๋ถ์, ์
์ฌ์ผ,
ROW_NUMBER() OVER(PARTITION BY ๋ถ์ ORDER BY ์
์ฌ์ผ ASC) AS ์๋ฒ
FROM ์ง์ํ
์ด๋ธ;
๐ฝ ๊ฒฐ๊ณผ (๋ถ์๋ณ๋ก ๊ทธ๋ฃน์ ๋๋๊ณ , ๊ทธ ์์์ ์๋ฒ ๋ถ์ฌ)
์ฌ์๋ฒํธ ๋ถ์ ์ ์ฌ์ผ ์๋ฒ
1005 | IT | 2019-12-01 | 1 |
1003 | IT | 2021-06-10 | 2 |
1004 | IT | 2023-05-20 | 3 |
1002 | ์์ | 2022-08-15 | 1 |
1001 | ์์ | 2023-03-01 | 2 |
โก ๋ถ์๋ณ๋ก ๋ฐ๋ก ๊ทธ๋ฃน์ ๋ง๋ค๊ณ , ๊ทธ ์์์ ์ ๋ ฌ ํ ์๋ฒ์ ๋ถ์ฌํจ
4๏ธโฃ PARTITION BY๋ฅผ ์ ์ฐ๋์?
- ๊ทธ๋ฃน๋ณ๋ก ์๋ฒ์ ๋ถ์ฌํ ๋ ์ ์ฉ
- ์ต์ ๋ฐ์ดํฐ 1๊ฑด์ฉ ๊ฐ์ ธ์ฌ ๋ ํจ๊ณผ์
- ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ๊ฑฐ๋, ํน์ ๊ทธ๋ฃน ๋ด์์ ์์๋ฅผ ๋งค๊ธธ ๋ ํ์ฉ
ROW_NUMBER()์ PARTITION BY๋ฅผ ํ์ฉํ ๋ฐ์ดํฐ ๊ทธ๋ฃนํ ๋ฐ ์ ๋ ฌ
ํน์ ๊ธฐ์ค(ORGN_CD, BCD_CD)์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ ํ, ์ต์ ๋ ์ง ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ์๋ฒ์ ๋ถ์ฌ
์ด๋ฅผ ํ์ฉํ๋ฉด ๊ฐ ๊ทธ๋ฃน๋ณ ์ต์ ๋ฐ์ดํฐ ์กฐํ, ์ค๋ณต ์ ๊ฑฐ, ํ์ด์ง ์ฒ๋ฆฌ ๋ฑ์ ์์
์ ํจ์จ์ ์ผ๋ก ์ํ ๊ฐ๋ฅ
1๏ธโฃ SQL ์ฝ๋ ๋ถ์
ROW_NUMBER() OVER(PARTITION BY MP.ORGN_CD, MP.BCD_CD ORDER BY ISNULL(MP.MDATE, MP.CDATE) DESC)
๐ ์ฝ๋ ํด์
1๏ธโฃ PARTITION BY MP.ORGN_CD, MP.BCD_CD
- ๋ฐ์ดํฐ๋ฅผ MP.ORGN_CD(์กฐ์ง ์ฝ๋)์ MP.BCD_CD(์นดํ ๊ณ ๋ฆฌ ์ฝ๋)๋ณ๋ก ๊ทธ๋ฃนํ(ํํฐ์ )
- ์ฆ, ๊ฐ์ ORGN_CD + BCD_CD ๊ฐ์ ๊ฐ์ง ํ๋ผ๋ฆฌ ํ๋์ ๊ทธ๋ฃน์ ํ์ฑ
2๏ธโฃ ORDER BY ISNULL(MP.MDATE, MP.CDATE) DESC
- MP.MDATE๊ฐ ์์ผ๋ฉด ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ, NULL์ด๋ฉด MP.CDATE๋ฅผ ๋์ ์ฌ์ฉํ์ฌ ์ ๋ ฌ
- ์ ๋ ฌ ๊ธฐ์ค์ ๋ด๋ฆผ์ฐจ์(์ต์ ๋ ์ง ์ฐ์ )
3๏ธโฃ ROW_NUMBER() ํจ์ ์ ์ฉ
- ๊ฐ ๊ทธ๋ฃน ๋ด์์ ์ ๋ ฌ๋ ์์๋๋ก 1๋ถํฐ ์์ํ๋ ์ผ๋ จ๋ฒํธ(RowNumber)๋ฅผ ๋ถ์ฌ
- ์ฆ, ๊ฐ ๊ทธ๋ฃน๋ณ ์ต์ ๋ฐ์ดํฐ๊ฐ RowNumber = 1์ด
2๏ธโฃ ์์ ๋ฐ์ดํฐ
ORGN_CD BCD_CD MDATE CDATE
A | X | 2023-01-01 | 2023-02-01 |
A | X | 2023-03-01 | NULL |
A | Y | 2023-02-15 | 2023-03-15 |
B | Z | NULL | 2023-01-15 |
์ด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ROW_NUMBER()๋ฅผ ์ ์ฉํ๋ฉด?
3๏ธโฃ SQL ์คํ ๊ฒฐ๊ณผ
ORGN_CD BCD_CD MDATE CDATE RowNumber
A | X | 2023-03-01 | NULL | 1 |
A | X | 2023-01-01 | 2023-02-01 | 2 |
A | Y | 2023-02-15 | 2023-03-15 | 1 |
B | Z | NULL | 2023-01-15 | 1 |
4๏ธโฃ ๊ฒฐ๊ณผ ๋ถ์
- PARTITION BY ORGN_CD, BCD_CD
- A, X ๊ทธ๋ฃน: ๋ ๊ฐ์ ๋ฐ์ดํฐ ์กด์ฌ โ ์ต์ ๋ฐ์ดํฐ(2023-03-01)์ RowNumber=1
- A, Y ๊ทธ๋ฃน: ํ๋์ ๋ฐ์ดํฐ๋ง ์กด์ฌ โ RowNumber=1
- B, Z ๊ทธ๋ฃน: ํ๋์ ๋ฐ์ดํฐ๋ง ์กด์ฌ โ RowNumber=1
- ORDER BY ISNULL(MDATE, CDATE) DESC
- NULL์ ๋ฐฉ์งํ๊ธฐ ์ํด ISNULL()์ ํ์ฉํ์ฌ MDATE๊ฐ NULL์ด๋ฉด CDATE๋ฅผ ๋์ ์ฌ์ฉ
- ๊ฐ์ฅ ์ต์ ๋ ์ง๊ฐ RowNumber = 1์ ๋ฐ๋๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
5๏ธโฃ ํ์ฉ ์ฌ๋ก
โ 1. ๊ฐ ๊ทธ๋ฃน๋ณ ์ต์ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
WITH LatestData AS (
SELECT
ORGN_CD,
BCD_CD,
MDATE,
CDATE,
ROW_NUMBER() OVER(PARTITION BY ORGN_CD, BCD_CD ORDER BY ISNULL(MDATE, CDATE) DESC) AS RowNumber
FROM ํ
์ด๋ธ๋ช
)
SELECT * FROM LatestData WHERE RowNumber = 1;
๐ ์ด๋ ๊ฒ ํ๋ฉด, ๊ฐ ๊ทธ๋ฃน์ ์ต์ ๋ฐ์ดํฐ๋ง ์กฐํ ๊ฐ๋ฅ!
โ 2. ์ค๋ณต ๋ฐ์ดํฐ ์ ๋ฆฌ
WITH DupData AS (
SELECT
ORGN_CD,
BCD_CD,
MDATE,
CDATE,
ROW_NUMBER() OVER(PARTITION BY ORGN_CD, BCD_CD ORDER BY ISNULL(MDATE, CDATE) DESC) AS RowNumber
FROM ํ
์ด๋ธ๋ช
)
DELETE FROM DupData WHERE RowNumber > 1;
๐ ๊ฐ ๊ทธ๋ฃน ๋ด์์ ๊ฐ์ฅ ์ต์ ๋ฐ์ดํฐ(RowNumber = 1)๋ง ๋จ๊ธฐ๊ณ ๋๋จธ์ง ์ค๋ณต ๋ฐ์ดํฐ ์ญ์ !
6๏ธโฃ ์ ๋ฆฌ
๊ฐ๋ ์ค๋ช
PARTITION BY | ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํ |
ORDER BY | ๊ทธ๋ฃน ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌ |
ROW_NUMBER() | ๊ฐ ๊ทธ๋ฃน ๋ด์์ 1๋ถํฐ ์์ฐจ์ ์ผ๋ก ๋ฒํธ ๋ถ์ฌ |
ISNULL() ํ์ฉ | NULL ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๋์ฒด ๊ฐ์ ์ง์ ํ์ฌ ์ ๋ ฌ |
'DB > ์ฟผ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MSSQL ๊ฒ์/์ ๋ฌด์ ๋์๋๋ ์ฟผ๋ฆฌ (1) | 2023.11.25 |
---|---|
STUFF ํจ์ (0) | 2023.10.10 |
WITH ์ , CTE(Common Table Expression) (1) | 2023.10.05 |
์๋์ฐํจ์ (0) | 2023.10.05 |
APPLY (0) | 2023.10.05 |