π μλμ° ν¨μ(WINDOW FUNCTION)λ?
- μλμ° ν¨μλ SQLμμ λ°μ΄ν°λ₯Ό λΆμνκ³ μ§κ³ν λ μ¬μ©λλ νΉλ³ν ν¨μμ λλ€.
- μΌλ°μ μΈ μ§κ³ ν¨μ(μ: SUM, COUNT λ±)λ κ²°κ³Όλ₯Ό κ·Έλ£Ήννμ¬ λ¨μΌ κ°μ λ°ννλ λ°λ©΄, μλμ° ν¨μλ κ·Έλ£Ήνλ λ°μ΄ν°μ κ° νμ λν΄ κ³μ°μ μννλ©°, κ²°κ³Όλ₯Ό μλ‘μ΄ μ΄λ‘ λ°νν©λλ€.
- μλμ° ν¨μλ GROUP BY μ μ μ¬μ©νμ§ μκ³ λ λ°μ΄ν° μ§κ³λ₯Ό μνν μ μμ΅λλ€. μ¦, λ°μ΄ν°μ λͺ¨λ νμ λν΄ μ°μ°μ μννλ©΄μλ κ° νμ μμΈ μ 보λ₯Ό μ μ§ν μ μμ΅λλ€.
- μλμ° ν¨μλ₯Ό μ¬μ©νλ©΄ λ¨μν μ§κ³λΏλ§ μλλΌ, μμ, μ΄λ νκ· , λ°±λΆμ¨ λ± λ€μν λΆμμ μνν μ μμΌλ©°, 볡μ‘ν μλΈμΏΌλ¦¬λ μμ° μ‘°μΈμ μ¬μ©νμ§ μκ³ λ λμΌν κ²°κ³Όλ₯Ό μ»μ μ μμ΄ μΏΌλ¦¬ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
π κΈ°λ³Έ λ¬Έλ²
SELECT
WINDOW_FUNCTION(ARGUMENTS) -- μλμ° ν¨μ νΈμΆ (ROW_NUMBER(), RANK(), SUM() λ±)
OVER ( -- OVER μ μμβ¨ (μλμ° ν¨μ λμ λ²μ μ μ)
[PARTITION BY 컬λΌ] -- κ·Έλ£Ήμ λλ μ»¬λΌ μ§μ β¨
[ORDER BY 컬λΌ] -- κ·Έλ£Ή λ΄ μ λ ¬ κΈ°μ€ μ€μ
[WINDOWING μ ] -- μλμ° λ²μ μ μβ¨
) -- OVER μ μ’
λ£
FROM
ν
μ΄λΈλͺ
; -- μ‘°νν ν
μ΄λΈ μ§μ
π WINDOWING μ
κ°μ
λΆμν νμ λ²μλ₯Ό μ€μ νλ©°, `ROWS`μ `RANGE` λ κ°μ§ ν€μλλ₯Ό ν΅ν΄ μ μλ©λλ€. λ€μμ κΈ°λ³Έ ꡬ문μ λλ€.
ROWS | RANGE BETWEEN <μμμ > AND <λμ >
-- ROWS: μ€μ ν μ κΈ°μ€μΌλ‘ λ²μ μ€μ β¨
-- RANGE: κ°μ λ²μλ₯Ό κΈ°μ€μΌλ‘ λ²μ μ€μ
- `BETWEEN ~ AND` ꡬ문μ μ¬μ©νμ¬ μλμ° νλ μμ μμκ³Ό λμ μ μν©λλ€.
- μμμ : `UNBOUNDED PRECEDING`, `CURRENT ROW`, λλ νΉμ νμ μλμ μμΉλ₯Ό κΈ°μ€μΌλ‘ μ§μ ν©λλ€.
- λμ : `UNBOUNDED FOLLOWING`, `CURRENT ROW`, λλ νΉμ νμ μλμ μμΉλ₯Ό κΈ°μ€μΌλ‘ μ§μ ν©λλ€.
μ¬μ© μμ
-- BETWEEN ~ AND μ¬μ©β¨
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -- 첫 λ²μ§Έ νλΆν° νμ¬ νκΉμ§ μ§μ (νμ¬ ν ν¬ν¨)
-- UNBOUNDED PRECEDING: νμ¬ ν κΈ°μ€ λͺ¨λ μ΄μ ν ν¬ν¨ (νλ μ μμ)
-- CURRENT ROW: νμ¬ ν ν¬ν¨ (νλ μ λ)
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING -- νμ¬ νλΆν° λ§μ§λ§ νκΉμ§ μ§μ (νμ¬ ν ν¬ν¨)
-- CURRENT ROW: νμ¬ ν ν¬ν¨ (νλ μ μμ)
-- UNBOUNDED FOLLOWING: νμ¬ ν κΈ°μ€ λͺ¨λ μ΄ν ν ν¬ν¨ (νλ μ λ)
ROWS BETWEEN VALUE_EXPR PRECEDING AND CURRENT ROW -- νμ¬ νμμ VALUE_EXPR λ§νΌ μ΄μ νκΉμ§ μ§μ (νμ¬ ν ν¬ν¨)
-- VALUE_EXPR PRECEDING: νμ¬ νμμ VALUE_EXPR λ§νΌ μ΄μ ν ν¬ν¨ (νλ μ μμ)
-- CURRENT ROW: νμ¬ ν ν¬ν¨ (νλ μ λ)
ROWS BETWEEN CURRENT ROW AND VALUE_EXPR FOLLOWING -- νμ¬ νμμ VALUE_EXPR λ§νΌ μ΄ν νκΉμ§ μ§μ (νμ¬ ν ν¬ν¨)
-- CURRENT ROW: νμ¬ ν ν¬ν¨ (νλ μ μμ)
-- VALUE_EXPR FOLLOWING: νμ¬ νμμ VALUE_EXPR λ§νΌ μ΄ν ν ν¬ν¨ (νλ μ λ)
-- BETWEEN ~ AND λ―Έμ¬μ©β¨
ROWS UNBOUNDED PRECEDING -- 첫 νλΆν° νμ¬ νκΉμ§
ROWS CURRENT ROW -- νμ¬ νλ§ ν¬ν¨
ROWS VALUE_EXPR PRECEDING -- νμ¬ νμμ VALUE_EXPR λ§νΌ μ΄μ μ νκΉμ§
π ν¨μ μ’ λ₯λ³ μ 리
1οΈβ£ μμ κ΄λ ¨
βοΈκ° : 100, 200, 200, 300 μΌ λ,
- `ROW_NUMBER` : 1, 2, 3, 4 (λͺ¨λ νμ λν΄ κ³ μ ν μμλ₯Ό λΆμ¬ν©λλ€.)
- `RANK` : 1, 2, 2, 4 (μ€λ³΅λ κ°μ λν΄ κ°μ μμλ₯Ό λΆμ¬νκ³ , λ€μ μμλ 건λλλλ€.)
- `DENSE_RANK` : 1, 2, 2, 3 (μ€λ³΅λ κ°μ λν΄ κ°μ μμλ₯Ό λΆμ¬νμ§λ§, λ€μ μμλ 건λλ°μ§ μμ΅λλ€.β¨)
2οΈβ£ μ§κ³ κ΄λ ¨
βοΈκ° : 100, 200, 300 μΌ λ,
- `SUM` : 600 (μ§μ ν μ΄μ ν©κ³λ₯Ό κ³μ°ν©λλ€.)
- `MAX` : 300 (μ§μ ν μ΄μ μ΅λκ°μ λ°νν©λλ€.)
- `MIN` : 100 (μ§μ ν μ΄μ μ΅μκ°μ λ°νν©λλ€.)
- `AVG` : 200 (μ§μ ν μ΄μ νκ· κ°μ κ³μ°ν©λλ€.)
- `COUNT` : 3 (νμ κ°μλ₯Ό κ³μ°ν©λλ€.)
3οΈβ£ ν μμ κ΄λ ¨
βοΈκ° : 100, 200, 300 μΌ λ,
- `FIRST_VALUE` : 100 (μ§μ ν μ΄μ 첫 λ²μ§Έ κ°μ λ°νν©λλ€.)
- `LAST_VALUE` : 300 (μ§μ ν μ΄μ λ§μ§λ§ κ°μ λ°νν©λλ€.)
- `LAG` : NULL, 100, 200 (μ§μ ν νμ μ΄μ κ°μ λ°νν©λλ€.β¨)
- `LEAD` : 200, 300, NULL (μ§μ ν νμ λ€μ κ°μ λ°νν©λλ€.β¨)
4οΈβ£ λΉμ¨ κ΄λ ¨
βοΈκ° : 100, 200, 300 μΌ λ,
- `PERCENT_RANK` : 0.00(0/2), 0.50, 1.00
- λΉμ¨ μμλ₯Ό κ³μ°νμ¬ κ° κ°μ μλμ μμΉλ₯Ό λ°νν©λλ€.β¨
- κ³μ° λ°©μ : (νμ¬ μμ - 1) / (μ 체 ν μ - 1)λ‘ κ³μ°λλ©°, μ΄λ‘ μΈν΄ κ°μ₯ μμ κ°μ 0.00, κ°μ₯ ν° κ°μ 1.00μ κ°μ΅λλ€.
- `CUME_DIST` : 0.33(1/3), 0.67, 1.00
- λμ λΆν¬λ₯Ό κ³μ°νμ¬ κ° κ°λ³΄λ€ μκ±°λ κ°μ κ°μ λΉμ¨μ λνλ λλ€.β¨
- κ³μ° λ°©μ : (νμ¬ κ°λ³΄λ€ μκ±°λ κ°μ κ°μ κ°μ) / (μ 체 ν μ)λ‘ κ³μ°λλ©°, μ΄λ‘ μΈν΄ κ°μ₯ ν° κ°μ νμ 1.00μ κ°μ΅λλ€.
- `RATIO_TO_REPORT` : 0.17(100/600), 0.33, 0.50
- κ°μ λΉμ¨μ μ 체 ν©κ³μ λν λΉμ¨λ‘ λ°νν©λλ€.β¨
- κ³μ° λ°©μ : (νΉμ κ°) / (μ 체 ν©κ³)λ‘ κ³μ°λλ©°, μ΄λ₯Ό ν΅ν΄ νΉμ κ°μ΄ μ 체μμ μ°¨μ§νλ λΉμ¨μ μ μ μμ΅λλ€.
β» Oracleμμλ§ μ§μλ©λλ€.
- `NTILE` : (n=3μΌ λ)1, 2, 3
- νμ nκ°μ κ·Έλ£ΉμΌλ‘ λλμ΄ κ·Έλ£Ή λ²νΈλ₯Ό λ°νν©λλ€.
- κ³μ° λ°©μ : μ 체 ν μλ₯Ό nμΌλ‘ λλμ΄ κ° κ·Έλ£Ήμ λ²μλ₯Ό μ νλ©°, κ° νμ ν΄λΉ κ·Έλ£Ή λ²νΈλ₯Ό λ°νλ°μ΅λλ€. μλ₯Ό λ€μ΄, n=3μ΄λ©΄ μ 체 λ°μ΄ν°κ° 3κ°μ κ·Έλ£ΉμΌλ‘ λλμ΄ κ°κ° 1, 2, 3μ κ·Έλ£Ή λ²νΈκ° λΆμ¬λ©λλ€.