λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ–₯️ λ°μ΄ν„°λ² μ΄μŠ€/SQL

[μœˆλ„μš° ν•¨μˆ˜] PARTITION BY 절과 ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλŠ” μœˆλ„μš° ν•¨μˆ˜

by OR15A 2023. 12. 14.
μœˆλ„μš° ν•¨μˆ˜λž€?
  • μœˆλ„μš° ν•¨μˆ˜λŠ” 였라클 뿐만 μ•„λ‹ˆλΌ SQL Server, PostgreSQL, MySQL(8.0 이상) λ“± λ‹€μ–‘ν•œ SQL λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©ν•  수 있음
  • 이 ν•¨μˆ˜λ“€μ€ 데이터λ₯Ό κ·Έλ£Ήν™”ν•˜κ³  각 κ·Έλ£Ή λ‚΄μ—μ„œ λ³΅μž‘ν•œ 계산을 μˆ˜ν–‰ν•  λ•Œ μ‚¬μš©

 

μœˆλ„μš° ν•¨μˆ˜
  1. ROW_NUMBER(): 각 νŒŒν‹°μ…˜ λ‚΄μ—μ„œμ˜ ν–‰ μˆœμ„œλ₯Ό λ°˜ν™˜ν•¨
  2. RANK(): νŠΉμ • μˆœμ„œμ— 따라 각 행에 μˆœμœ„λ₯Ό 맀김. 같은 값이면 같은 μˆœμœ„λ₯Ό λΆ€μ—¬ν•˜λ©°, μˆœμœ„μ— 곡백이 μžˆμ„ 수 있음
  3. DENSE_RANK(): RANK()와 μœ μ‚¬ν•˜μ§€λ§Œ, 곡백 μ—†λŠ” 연속적인 μˆœμœ„λ₯Ό 뢀여함
  4. SUM(): νŒŒν‹°μ…˜ λ‚΄μ—μ„œμ˜ 합계λ₯Ό 계산
  5. AVG(): νŒŒν‹°μ…˜ λ‚΄μ—μ„œμ˜ 평균값을 계산
  6. MIN() 및 MAX(): νŒŒν‹°μ…˜ λ‚΄μ—μ„œμ˜ μ΅œμ†Œκ°’κ³Ό μ΅œλŒ€κ°’μ„ 계산
  7. LEAD() 및 LAG(): λ‹€μŒ ν–‰μ΄λ‚˜ 이전 ν–‰μ˜ 값을 λ°˜ν™˜ν•¨

 

μ‚¬μš© μ˜ˆμ‹œ ν˜•νƒœ
SELECT 
    ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2) AS row_num,
    RANK() OVER (PARTITION BY column1 ORDER BY column2) AS rank,
    DENSE_RANK() OVER (PARTITION BY column1 ORDER BY column2) AS dense_rank,
    SUM(column3) OVER (PARTITION BY column1) AS sum_column3,
    AVG(column3) OVER (PARTITION BY column1) AS avg_column3
FROM 
    table_name;
  • 이 μΏΌλ¦¬λŠ” column1을 κΈ°μ€€μœΌλ‘œ 데이터λ₯Ό νŒŒν‹°μ…˜ν•˜κ³ 
  • column2의 μˆœμ„œμ— 따라 각 행에 λŒ€ν•œ ROW_NUMBER, RANK, DENSE_RANKλ₯Ό κ³„μ‚°ν•˜λ©°
  • column3의 합계와 평균을 각 νŒŒν‹°μ…˜ λ³„λ‘œ 계산함