λ°°κ²½
νμ¬μμ μ΄λ€ μ 무λ₯Ό μ²λ¦¬νλ λμ€ μλμ κ°μ μꡬμ¬νμ λ§μ‘±νλ SQL μ μ§μΌνλ€.
νΉμ μΌμ λ°μν transaction μ€ κ°μ₯ μ΅μ transaction λ°μ΄ν°λ₯Ό λ½μλΌ
μ΄ tx λ°μ΄ν°λ 맀μΌλ§λ€ λλμΌλ‘ λ°μνλ λ°μ΄ν°λ‘ append only ν μ΄λΈμ΄λ€.
userId κ° key λ‘ μ‘νμκ³ n κ°μ tx λ°μ΄ν°κ° μλλ° λ μ§ μμΌλ‘ μ λ ¬λ μ΅μ μ λ°μ΄ν°λ₯Ό λ½κΈ° μν΄ distinct κ° νμνλ€.
λλ μμ°μ€λ½κ² group by 쿼리λ₯Ό μ§°λλ° μκ°ν΄λ³΄λ λΉμ°ν group by λ‘λ ν΄λΉ μꡬμ¬νμ λ§μ‘±ν μ μμλ€. κ·Έλ¬λ€ λ°μ΄ν° μμ§λμ΄λ§ νμκ² λμμ μμ²νμκ³ window ν¨μλ₯Ό μ¬μ©νλ©΄ λ΄κ° μνλ μν©μ 100% λ§μ‘±μν¬ μ μμκ³ μ΄μ λν λ΄μ©μ 곡μ ν΄λ³΄λ € νλ€.
Group By μ νκ³
μ΄μΌκΈ° ν λ΄μ©μ Group By μ νκ³λΌκΈ° λ³΄λ€ νΉμ±μ κ°κΉλ€.
Group By λ λ°μ΄ν°λ₯Ό Grouping νμ¬ κ° group λ³λ‘ κ³μ°λ κ²°κ³Όλ₯Ό μμ±ν λ μ¬μ©νλ€.
μμλ‘ λ΄λ³΄μ
μμΌλ‘ μμ λ‘ μ¬μ©ν μλ ν μ΄λΈ μ€ν€λ§λ μμ£Ό κ°λ¨νλ€
id, userId κ·Έλ¦¬κ³ μνλ₯Ό λνλ΄λ status μ μ£Όλ¬ΈμΌμ΄ μλ€
κ·Έλ¦¬κ³ 5κ°μ dummy data κ° λ€μ΄μλ€
Group By ν¨μλ₯Ό μ΄μ©νλ€λ©΄ user μ μΌμλ³ μ£Όλ¬Έμ ν©κ³λ₯Ό λνλΌ μ μλ€
SELECT user_id, ordered_at::DATE, count(1)
FROM orders
GROUP BY user_id, ordered_at::DATE;
μ΄μΈμλ λ€μνκ² sum μ΄λ avg λ₯Ό μ΄μ©ν΄ μ°μ κ³μ°μ ν μλ μμ§λ§ μ€μν μ¬μ€μ Group By μ λͺ μλμ§ μμ νλλ select ν μ μλ€λ κ²μ΄λ€.
Group By λ κ·Έλ£Ήνλ κ²°κ³Όλ₯Ό κΈ°μ€μΌλ‘ μμ μ μννκΈ° λλ¬Έμ λͺ μλμ§ μμ λλ¨Έμ§ νλλ₯Ό Result Set μ€ μ΄λμ νν ν μ§ μ 맀νκΈ° λλ¬Έμ΄λ€.
μ΄λ₯Ό μν΄μλ WITH νΉμ Sub query λ₯Ό μ΄μ©ν΄μΌ νλλ° μ΄ λ§μ λ νΉμ μΌμ΄μ€μμλ§ κ°λ₯νλ€λ κ²μ΄λ€.
μλμ° ν¨μ
μμ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ¬μ©ν κ²μ΄ Window ν¨μμ΄λ€.
postgresql Window Function docs μμ μμΈν λ΄μ©μ νμΈν μ μλ€.
ν΅μ¬μ λ€μκ³Ό κ°λ€.
ν μ΄λΈμμ ν κ·Έλ£Ήμ μ μνκ³ , κ·Έλ£Ή λ΄μμ κ³μ°μ μννλλ‘ μ€κ³λ ν¨μλ‘ λ μ½λλ³ κ³μ°μ μννλ©΄μ λ°μ΄ν°λ₯Ό μ 체 μ°Έμ‘°νκ³ μΆμ κ²½μ°μ μ¬μ©λλ€. μμΈν λ΄μ©μ PostgreSQL Window Function Docs μμ νμΈν μ μλ€.
νμ κ·Έλ£Ήμ μ μνλ€λ λ©΄μμλ Group By μ λμΌνμ§λ§ μ 체 λ°μ΄ν°λ₯Ό μ°Έμ‘°ν μ μλ€λ μ μμ λ€λ₯΄λ€.
ν¨μμ μ¬μ©λ²μ λ€μκ³Ό κ°λ€.
SELECT WINDOW_FUNCTION (ARGUMENTS) OVER
( [PARTITION BY 컬λΌ] [ORDER BY 컬λΌ] [WINDOWING μ ] )
FROM ν
μ΄λΈλͺ
;
- OVER(): μλμ°λ₯Ό μ μ
- PARTITION BY: κ·Έλ£Ήν κΈ°μ€ μ§μ
- ORDER BY: μ λ ¬ κΈ°μ€ μ§μ
window ν¨μλ over μ partition by λ₯Ό ν¨κ» μ¬μ©ν΄μΌ νλ€.
partition by λ₯Ό μ΄μ©ν΄μ Grouping ν κΈ°μ€μ μ ν΄μ£Όκ³ windowing ν κΈ°μ€μ μ ν΄μ£Όλ©΄ λλ€.
Window ν¨μλ₯Ό μ΄μ©ν΄μ 2024-11-17 μ λ°μν μ£Όλ¬Έ μ€ κ°μ₯ μ΅μ μ μ£Όλ¬Έμ μ‘°ννλΌ
λΌλ μ건μ λ§μ‘±μν€λ©΄ λ€μκ³Ό κ°λ€
1. window ν¨μλ‘ μΌμλ³ μ λ ¬νκΈ°
SELECT *,
row_number() over (partition by user_id order by ordered_at desc)
FROM orders
μ¬κΈ°μ μ¬μ©ν row_number()
ν¨μλ windowing κΈ°μ€μ λ°λΌ μμλλ‘ λ²νΈλ₯Ό λΆμ¬νλ€.
2. WITH ꡬ문μ μ΄μ©νμ¬ ν μ΄λΈ κ²μ
with TMP as (SELECT *,
row_number() over (partition by user_id order by ordered_at desc) as RN
FROM orders)
SELECT *
FROM TMP
WHERE RN = 1;
κ°μ₯ μ΅μ μ μ£Όλ¬Έμ μ‘°ννκΈ° μν΄ μμ μ‘°νν κ²°κ³Όλ₯Ό Sub query λ‘ λ£κ³ row number μ 쑰건μ μΆκ°νλ©΄ μλμ κ°μ΄ μνλ κ²°κ³Όκ° μ‘°νλλ€
λ€μν Window ν¨μλ€
μμ μ¬μ©ν window ν¨μλ row_number()
λ‘ windowing 쑰건μ λ°λΌ μμλ§ λΆμ¬ν κ²μ΄λ€.
μ΄μΈμλ λ€μν ν¨μλ€μ΄ μ‘΄μ¬νλ€
- νΉμ κ°μ ν©μ°νλ SUM OVER
- νμ¬ νμ κΈ°μ€μΌλ‘ μ΄μ νμ κ°μ κ°μ Έμ€λ LAG OVER
- μμλ₯Ό λΆμ¬νλ RANK OVER
λ±λ±
'π¬web application > - Database' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
100λ§κ° 1000λ§κ°μ λλ―Έλ°μ΄ν°λ₯Ό μμ±νλ κ°μ₯ μ¬μ΄ λ°©λ² (1) | 2024.10.20 |
---|---|
μ€νμ νμ΄μ§, λ¨κ³λ³λ‘ μ΅μ ννκΈ° (0) | 2023.11.19 |
μ€νμ νμ΄μ§μ΄ λλ¦° μ§μ§ μ΄μ (5) | 2023.11.19 |
[λ°μ΄ν°λ² μ΄μ€] Isolation Level, κ³ λ¦½ μμ€ (0) | 2021.04.07 |
[λ°μ΄ν°λ² μ΄μ€] Transaction, νΈλμμ μ΄λ? (0) | 2021.04.07 |
λκΈ