240521 Today I Learn
Window Function
๐ก Window Function
ํ๊ณผ ํ์ ๊ด๊ณ๋ฅผ ์ ์ํ๊ธฐ ์ํด ์ ๊ณต๋๋ ํจ์๋ก ๋ชจ๋ ์ปฌ๋ผ์ ์๊ณ ์ถ์ง ์์ ๋ ์ฌ์ฉํ๋ค.
# ์๋์ฐ ํจ์ ๊ธฐ๋ณธ๋ฌธ๋ฒ SELECT WINDOW_FUNCTION () OVER([PARTITION BY ์ปฌ๋ผ] [ORDER BY ์ปฌ๋ผ]) FROM ํ ์ด๋ธ๋ช โ
< ์๋์ฐ ํจ์์ ์ข ๋ฅ>
์ข ๋ฅ | ํจ์ |
์์ | RANK, DENSE_RANK, ROW_NUMBER |
์ง๊ณ | SUM, MAX, MIN, AVG, COUNT |
์์ | FIRST_VALUE, LAST_VALUE, LAG, LEAD |
๋น์จ | RATIO_TO_REPROT, CUME_DIST |
์์
๐ก ROW_NUMBER
' ์ค์ธ์ฐ๊ธฐ๋ฅผ ํ๋ค.' → ์ค์ธ์ฐ๊ธฐ๋ฅผ ํ๋ค๊ณ ํ์ ๋ ์ค๋ณต ์์ ๋ฐ์ ๋ถ๊ฐํจ.
์ด๋ป๊ฒ๋ ์์๋ฅผ ์ง์ ํจ.
ROW_NUMBER() OVER(PARTITION BY ์ปฌ๋ผ1 ORDER BY ์ปฌ๋ผ2)
SELECT *, ROW_NUMBER() OVER(PARTITION BY job ORDER BY salary)
from basic.window1
๐ก RANK()
๋ง์ ์๊ฐ ๋๋ช ์ด๋ผ๋ฉด? ๋์ ์๊ฐ ๋ฐ์ํ ๋ ๊ณต๋ ์์๋ฅผ ๋ถ์ฌํ๋ค.
๊ทธ๋ฌ๋ ๊ณต๋ ์์๊ฐ ์๋ ๋งํผ, ๋ท ์์๊ฐ ์์ด์ง๋ค.
→ 10๋ช ์ค ๋ง์ ์๊ฐ 3๋ช ์ด๋ผ๋ฉด, 99์ ์ ๋ฐ์ ์ฌ๋์ 4๋ฑ์ด ๋๋ค.
RANK() OVER(PARTITION BY ์ปฌ๋ผ1 ORDER BY ์ปฌ๋ผ2)
SELECT *, RANK() OVER(PARTITION BY job ORDER BY salary)
from basic.window1
๐ก DENSE_RANK()
RANK()์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณต๋ ์์๋ฅผ ๋ถ์ฌํ๋ค. ์ฐจ์ด์ ์ ๊ทธ ๋ค์์ค๋ ์์๋ฅผ ๋งค๊ธฐ๋ ๋ฐฉ์์ผ๋ก,
DENSE_RANK์ ๊ฒฝ์ฐ ๊ณต๋์์์ ๋ท์์๋ ๊ณต๋์์์์ ์์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
→ 10๋ช ์ค ๋ง์ ์๊ฐ 3๋ช ์ด๋ผ๋ฉด, 99์ ์ ๋ฐ์ ์ฌ๋์ 2๋ฑ์ด ๋๋ค.
DENSE_RANK() OVER(PARTITION BY ์ปฌ๋ผ1 ORDER BY ์ปฌ๋ผ2)โโ
SELECT *, DENSE_RANK() OVER(PARTITION BY job ORDER BY salary)
from basic.window1
์์
๐ก FIRST_VALUE
ํํฐ์ ๋ณ ๊ฐ์ฅ ๋จผ์ ๋์จ ๊ฐ์ ๊ตฌํด ์ถ๋ ฅํ๋ค. ๊ณต๋ ๋ฑ์๋ ์ธ์ ํ์ง ์๊ณ , ์ฒ์ ๋์จ ํ๋ง ๊ฐ์ ธ์จ๋ค.
FIRST_VALUE(์ปฌ๋ผ1) OVER(PARTITION BY ์ปฌ๋ผ2 ORDER BY ์ปฌ๋ผ3)โ
SELECT *, FIRST_VALUE(name) OVER(PARTITION BY job ORDER BY salary)
FROM basic.window1
๐ก LAST_VALUE
ํํฐ์ ๋ณ ๊ฐ์ฅ ๋ง์ง๋ง์ ๋์จ ๊ฐ์ ๊ตฌํด ์ถ๋ ฅํ๋ค. ๊ณต๋ ๋ฑ์๋ ์ธ์ ํ์ง ์๊ณ , ๋์ค์ ๋์จ ํ๋ง ๊ฐ์ ธ์จ๋ค.
LAST_VALUE(์ปฌ๋ผ1) OVER(PARTITION BY ์ปฌ๋ผ2 ORDER BY ์ปฌ๋ผ3)โ
SELECT *, LAST_VALUE(name) OVER(PARTITION BY job ORDER BY salary)
FROM basic.window1
๐ก LAG
์ด์ N ๋ฒ์งธ์ ํ์ ๊ฐ์ ธ์ค๋ ํจ์. N ์ ์ต๋๊ฐ์ผ๋ก 3์ ๊ฐ์ง๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ 1 ์ด๋ค.
LAG(์ปฌ๋ผ1, ์ซ์) OVER (PARTITION BY ์ปฌ๋ผ2 ORDER BY ์ปฌ๋ผ3)โ
SELECT *, LAG(salary,2) OVER (ORDER BY name) as prev_sal
from basic.window1
๐ก LEAD
์ดํ Nํ์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ํจ์๋ก LAG์ ๋ฐ๋๋๋ค.
LEAD(์ปฌ๋ผ1, ์ซ์) OVER (PARTITION BY ์ปฌ๋ผ2 ORDER BY ์ปฌ๋ผ3)โ
SELECT * , LEAD(salary,2) OVER (ORDER BY name) as prev_sal
from basic.window1
๋น์จ
๐ก CUME_DIST
ํํฐ์ ๋ณ ์ ์ฒด๊ฑด์์์ ํ์ฌ ํ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฑด์์ ๋ํ ๋์ ๋ฐฑ๋ถ์จ์ ์ถ๋ ฅํ๋ค.
CUME_DIST() OVER (PARTITION BY ์ปฌ๋ผ1 ORDER BY ์ปฌ๋ผ2)โ
SELECT * , cume_dist() OVER (partition by JOB order BY SALARY)
FROM basic.window1
WITH ์ vs. ์๋ธ์ฟผ๋ฆฌ
์์ํ ์ด๋ธ์ ์์ฑํ๋ WITH ์ ์ ๊ฒฝ์ฐ ์ฌ์ฌ์ฉ์ฑ์ด ์ข๊ณ , ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ๋ ๊ทธ๋๋ง๋ค ์์ฑํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ด์ฉ์ด๋๋ผ๋ ์ฌ๋ฌ๋ฒ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๊ธฐ์๋ ๋ถํธํ ์ ์๋ค. ๋ํ ๊ฐ๋ ์ฑ ์ญ์ WITH์ ์ด ์ข๊ธฐ ๋๋ฌธ์ 2ํ ์ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ WITH์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
WITH์
Leetcode #602 Write a solution to find the people who have the most friends and the most friends number. The test cases are generated so that only one person has the most friends.
→ ์น๊ตฌ๊ฐ ๊ฐ์ฅ ๋ง์ ์ฌ๋์ ์ด๋ฆ๊ณผ, ์น๊ตฌ์ ์๋ฅผ ๊ตฌํ๋ผ.
# WITH์ ์ ํ์ฉํด ์์ ํ
์ด๋ธ ์์ฑ
WITH customer2 as (
SELECT id, count(*) num
FROM (
SELECT requester_id id
FROM RequestAccepted
UNION ALL
SELECT accepter_id id
FROM RequestAccepted
)a
GROUP BY 1
)
# WITH์ ํ์ฉํ๊ธฐ
SELECT id, num
FROM customer2
WHERE num = (SELECT max(num)
FROM customer2)
WITH์ ์ ์ด์ฉํด customer2๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ ํ ์ด๋ธ์ ์์ฑํ๋ค. ์ด๋ ๊ฒ ๋ณต์กํ ์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ํด ๋งค๋ฒ ๋ฐ๋ณต ์์ฑํ๋ฉด ๊ต์ฅํ ๋ถํธํ ํ ๋ฐ, ์ด๋ ๊ฒ customer2๋ผ๋ ์์ ํ ์ด๋ธ์ WITH์ ์ ์ด์ฉํด ๋ง๋ค์ด๋๊ณ ํธ์ถํ๋ฉด ๋ฒ๊ฑฐ๋ก์ด ์์ ์ ์ค์ผ ์ ์๋ค.
์๋ธ์ฟผ๋ฆฌ
์ผ๋ฐ ์๋ธ์ฟผ๋ฆฌ
- ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ : ํ๋์ ํ๋ง ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ. ๋จ์ผํ ๋น๊ต ์ฐ์ฐ์ (=, >, <, <>) ๋ง ์ฌ์ฉ
SELECT *
FROM T_PEARSON A
WHERE A.PERSON_NO = ( SELECT B.PERSON_NO
FROM T_PERSON B
WHERE B.NAME = 'Aiden')
- ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ : ์ฌ๋ฌ๊ฐ์ ํ์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ. ๋ค์คํ ๋น๊ต ์ฐ์ฐ์ (IN, ANY, SOME, EXISTS ๋ฑ)๋ฅผ ์ฌ์ฉ
SELECT A.NAME
FROM T_PERSON A
WHERE A.PERSON_NO IN (SELECT B.PERSON_NO
FROM T_GRADE B
WHERE GRADE = 'A')
- ๋ค์ค ์ปฌ๋ผ ์๋ธ์ฟผ๋ฆฌ : ๋ ๊ฐ ์ด์์ ์ปฌ๋ผ์ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ
SELECT *
FROM T_PERSON A
WHERE (A.NAME, A.AGE) IN (SELECT B.NAME, B.AGE
FROM T_PERSON B
WHERE B.PERSON_NO < 3)
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ : SELECT ์ ์์ ํ๋์ ์ปฌ๋ผ์ฒ๋ผ ์ฌ์ฉ๋จ
SELECT col1
, (SELECT * ...)
์ธ๋ผ์ธ ๋ทฐ : ํ๋์ ํ ์ด๋ธ์ฒ๋ผ ์ฌ์ฉ
FROM ( SELECT ... ) AS a
์ฟผ๋ฆฌ ์คํ์ผ ๊ฐ์ด๋
- ์์ฝ์ด(SELECT, FROM..)๋ ๋๋ฌธ์๋ก ์์ฑํ๋ค.
- ์ปฌ๋ผ ์ด๋ฆ์ snake_case๋ก ์์ฑํ๋ค.
- snake_case ๐ : snake_case ์ ๊ฐ์ด ๋ชจ๋ ๋จ์ด๋ค์ ์ธ๋๋ฐ(_)๋ก ์ฐ๊ฒฐํ๋ค.
- Camel Case ๐ซ : Camel Case์ ๊ฐ์ด ๋์ด์ฐ๊ธฐํ๋ ๊ฒฝ์ฐ ๋จ์ด์ ์์ ๋๋ฌธ์๋ก ์์ฑํ๋ค.
- ํ ์ด๋ธ ๋ช ์ด๋ ์ปฌ๋ผ ์ด๋ฆ์ ๊ฐ๋ฅํ ๋ช ์์ ์ผ๋ก ์์ฑํ๋ค.
- ์ผ์ชฝ ์ ๋ ฌ์ ๋ง์ถฐ์ค๋ค.
- ์์ฝ์ด๋ ์ปฌ๋ผ์ ํ์ค์ ํ๋์ฉ ์์ฑํ๋ค.
'๐ Today I Learn > ๐ My SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SQL Challenge ์ธ์ #3 ํผ๋(Funnel)๋ถ์ (0) | 2024.05.29 |
---|---|
SQL Challenge ์ธ์ #2 ์ด๋ํ๊ท ๊ณผ ๋น์จ (0) | 2024.05.27 |
Union๊ณผ Order by (0) | 2024.05.04 |
SQL ์ธ์ #1 (0) | 2024.05.04 |
[DBaver] csv ํ์ผ ๋ถ๋ฌ์ค๊ธฐ (ํ๊ธ ๊นจ์ง ํด๊ฒฐ๋ฒ) (0) | 2024.05.04 |