๐Ÿ“’ Today I Learn/๐Ÿ˜Š My SQL

SQL Challenge ์„ธ์…˜ #1 ์œˆ๋„์šฐ ํ•จ์ˆ˜, WITH์ ˆ

ny:D 2024. 5. 27. 15:05

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

์ฟผ๋ฆฌ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ

  1. ์˜ˆ์•ฝ์–ด(SELECT, FROM..)๋Š” ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  2. ์ปฌ๋Ÿผ ์ด๋ฆ„์€ snake_case๋กœ ์ž‘์„ฑํ•œ๋‹ค.
    • snake_case ๐Ÿ : snake_case ์™€ ๊ฐ™์ด ๋ชจ๋“  ๋‹จ์–ด๋“ค์„ ์–ธ๋”๋ฐ”(_)๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.
    • Camel Case ๐Ÿซ : Camel Case์™€ ๊ฐ™์ด ๋„์–ด์“ฐ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ ๋‹จ์–ด์˜ ์•ž์„ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  3. ํ…Œ์ด๋ธ” ๋ช…์ด๋‚˜ ์ปฌ๋Ÿผ ์ด๋ฆ„์€ ๊ฐ€๋Šฅํ•œ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  4. ์™ผ์ชฝ ์ •๋ ฌ์„ ๋งž์ถฐ์ค€๋‹ค.
  5. ์˜ˆ์•ฝ์–ด๋‚˜ ์ปฌ๋Ÿผ์€ ํ•œ์ค„์— ํ•˜๋‚˜์”ฉ ์ž‘์„ฑํ•œ๋‹ค.