πμμ½
μλμ° ν¨μ μ€ νλμΈ μμ ν¨μλ₯Ό μ¬μ©νλ©΄ κ²°κ³Ό μ§ν©μ κ° νμ μμλ₯Ό ν λΉν μ μμ΅λλ€.
RANK() | DENSE_RANK() | ROW_NUMBER() | |
λμΌ κ° μ²λ¦¬ | λμΌ μμ λΆμ¬ | λμΌ μμ λΆμ¬ | κ° νλ³ κ³ μ μμ λΆμ¬ |
μμ κ°κ²© | λμΌ μμμλ κ²½μ°, κ·Έ λ€μ μμλ μ΄μ λμΌ μμλ₯Ό κ°μ§ ν μλ§νΌμ κ°κ²© λ°μ |
λμΌ μμκ° μμ΄λ, μμλ₯Ό 건λλ°μ§ μκ³ (κ°κ²© μμ΄) μ°μλ μμλ₯Ό λΆμ¬ |
λμΌ μμκ° μμ΄λ, κ° νμλ μμ°¨μ μΌλ‘ μ λν¬ν μμ λΆμ¬ |
μμ | 1,2,2,4,5, ... | 1,2,2,3,4, ... | 1,2,3,4,5, ... |
1. RANK() ν¨μ
[MySQL Tutorial]
RANK() ν¨μλ κ²°κ³Ό μ§ν©μ νν°μ λ΄ κ° νμ μμλ₯Ό ν λΉν©λλ€.
νμ μμλ 1μ κ·Έ μμ μ€λ μμ μλ₯Ό λν κ°μΌλ‘ μ§μ λ©λλ€.
[Oracle Tutorial]
RANK() ν¨μλ κ° μ§ν©μμ κ°μ μμλ₯Ό κ³μ°νλ λΆμ ν¨μμ λλ€.
RANK() ν¨μλ λμΌν κ°μ κ°μ§ νμ λν΄ λμΌν μμλ₯Ό λ°νν©λλ€. λλ₯ μμμ λλ₯ ν μλ₯Ό λν΄ λ€μ μμλ₯Ό κ³μ°ν©λλ€. λ°λΌμ μμλ μ°μλ μ«μκ° μλ μλ μμ΅λλ€.
RANK() ν¨μλ μμ N λ° νμ N 쿼리μ μ μ©ν©λλ€.
RANK() ν¨μλ μλμ° ν¨μ μ€ κ·Έλ£Ή λ΄ μμ ν¨μλ‘, νΉμ μλμ°(λΆλΆ)λ΄μμ μμλ₯Ό ν λΉνλ λ° μ¬μ©ν©λλ€.
λμΌν κ°μ κ°μ§ νμ λν΄ λμΌν μμλ₯Ό λΆμ¬νκ³ κ·Έ λ€μ μμλ λμΌ μμλ₯Ό κ°μ§ ν μλ§νΌμ μνμ€ κ°κ²©μ΄ μκΉλλ€.
μλ₯Ό λ€μ΄ 3μκ° 3λͺ μ΄λΌλ©΄, 1,2,3,3,3,6,7,8, ... μ΄λ κ² μμκ° λ§€κ²¨μ§λλ€.
RANK() λ¬Έλ²
MySQLκ³Ό Oracleμ RANK() ν¨μ λ¬Έλ²μ κ°κ° μλμ κ°μ΅λλ€.
MySQL
RANK() OVER (
PARTITION BY <expression>[{,<expression>...}]
ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)
Oracle
RANK() OVER ([query_partition_clause] order_by_clause)
- PARTITION BY | query_partition_clause : κ²°κ³Ό μ§ν©μ νν°μ
μΌλ‘ λλλλ€.
- μ΅μ κ°μ΄λ©°, μλ΅ν κ²½μ° μ‘°ν κ²°κ³Όμ λͺ¨λ νμ νλμ νν°μ μΌλ‘ μ·¨κΈν©λλ€.
- ORDER BY | order_by_clause : νλ μ΄μμ μ΄μ΄λ ννμμ κΈ°μ€μΌλ‘ νν°μ
λ΄μ νμ μ λ ¬ν©λλ€.
- νμ κ°μ΄λ©°, ν¨μκ° μ μ©λλ κ° νν°μ μ νμ λ Όλ¦¬μ μΈ μ λ ¬ μμλ₯Ό κ²°μ ν©λλ€.
2. DENSE_RANK() ν¨μ
[MySQL Tutorial]
DENSE_RANK() ν¨μλ μμ κ°μ μ°¨μ΄ μμ΄ νν°μ λλ κ²°κ³Ό μ§ν© λ΄μ κ° νμ μμλ₯Ό ν λΉνλ μλμ° ν¨μμ λλ€.
νμ μμλ ν μμ μ€λ κ³ μ ν μμ κ°μμ 1μ© μ¦κ°ν©λλ€.
[Oracle Tutorial]
DENSE_RANK() ν¨μλ μ λ ¬λ ν μ§ν©μμ νμ μμλ₯Ό κ³μ°νλ λΆμ ν¨μμ λλ€.
RANK() ν¨μμ λ¬λ¦¬ DENSE_RANK() ν¨μλ μμ κ°μ μ°μλ μ μλ‘ ν λΉν©λλ€. λλ₯ μΈ κ²½μ°μλ μμλ₯Ό 건λλ°μ§ μμ΅λλ€.
μμ κΈ°μ€ κ°μ΄ λμΌν νμλ λμΌν μμ κ°μ΄ μ μ©λ©λλ€.
DENSE_RANK() ν¨μλ RANK() ν¨μμ λμΌνκ² λμΌν κ°μ κ°μ§ νμ λν΄ λμΌν μμλ₯Ό λΆμ¬νμ§λ§ κ·Έ λ€μμ λμ€λ νμλ μμλ₯Ό 건λλ°μ§ μκ³ μ΄μ΄μ μμλ₯Ό λΆμ¬ν©λλ€.
μλ₯Ό λ€μ΄ 3μκ° 3λͺ μ΄λΌλ©΄, 1,2,3,3,3,4,5,6, ... μ΄λ κ² μμκ° λ§€κ²¨μ§λλ€.
DENSE_RANK() λ¬Έλ²
MySQLκ³Ό Oracleμ DENSE_RANK() ν¨μ λ¬Έλ²μ κ°κ° μλμ κ°μ΅λλ€.
MySQL
DENSE_RANK() OVER (
PARTITION BY partition_expression
ORDER BY sort_expression [ASC|DESC]
)
Oracle
DENSE_RANK( ) OVER([ query_partition_clause ] order_by_clause)
PARTITION BY | query_partition_clause κ³Ό ORDER BY | order_by_clauseλ RANK() ν¨μμμμ μ€λͺ κ³Ό κ°μ΅λλ€.
DENSE_RANK()λ νν°μ μ λμΌν μμ κ°μ κ°μ§ λ κ° μ΄μμ νμ΄ μλ κ²½μ°, κ° νμ λμΌ μμκ° λΆμ¬λκ³ , RANK()ν¨μμλ λ¬λ¦¬ νμ μ°μλ μμ κ°μ ν λΉ ν©λλ€. (λμΌ μμκ° μλ€νλλΌλ)
3. ROW_NUMBER() ν¨μ
[MySQL Tutorial]
ROW_NUMBER() ν¨μλ κ²°κ³Ό μ§ν©μ κ° νμ μΌλ ¨ λ²νΈλ₯Ό ν λΉνλ μλμ° ν¨μ νΉμ λΆμ ν¨μμ λλ€.
첫λ²μ§Έ μ«μλ 1λ‘ μμν©λλ€.
[Oracle Tutorial]
ROW_NUMBER() ν¨μλ μ μ©λλ κ° ν(νν°μ μ κ° ν λλ κ²°κ³Ό μ§ν©μ κ° ν)μ μμ°¨μ μΌλ‘ κ³ μ ν μ μλ₯Ό ν λΉνλ λΆμ ν¨μμ λλ€.
ROW_NUMBER() ν¨μλ κ²°κ³Ό μ§ν© λ΄μ κ° νμ κ³ μ λ²νΈλ₯Ό ν λΉν©λλ€.
RANK()λ DENSE_RANK() ν¨μλ³΄λ€ λ§€μ° κ°λ¨ν©λλ€.
ROW_NUMBER() ν¨μλ κ° νμ μμλ₯Ό λΆμ¬ν λ λμΌν κ°μ΄ μμ΄λ μ΄λ₯Ό 무μνκ³ μ°μμ μΈ μμλ₯Ό λΆμ¬ν©λλ€.
μλ₯Ό λ€μ΄ 3μκ° 3λͺ μ΄λΌν΄λ, 1,2,3,4,5,6, ... μ΄λ κ² μμκ° λ§€κ²¨μ§λλ€.
ROW_NUMBER() λ¬Έλ²
MySQLκ³Ό Oracleμ RANK() ν¨μ λ¬Έλ²μ κ°κ° μλμ κ°μ΅λλ€.
MySQL
ROW_NUMBER() OVER (
PARTITION BY <expression>,[{,<expression>}...]
ORDER BY <expression> [ASC|DESC],[{,<expression>}...]
)
Oracle
ROW_NUMBER() OVER (
[query_partition_clause]
order_by_clause
)
PARTITION BY | query_partition_clause κ³Ό ORDER BY | order_by_clauseλ RANK() ν¨μμμμ μ€λͺ κ³Ό κ°μ΅λλ€.
4. RANK() vs DENSE_RANK() vs ROW_NUMBER()
μ§κΈκΉμ§ μμλ³Έ 3κ°μ§ μλμ° ν¨μμΈ RANK(), DENSE_RANK(), ROW_NUMBER()μ μ€μ κ²°κ³Όκ°μ μ°¨μ΄λ₯Ό νμΈν΄λ³΄κ² μ΅λλ€.
νμ μ λ³΄κ° λ΄κΈ΄ ν μ΄λΈμ κ°λ¨νκ² λ§λ€κ³ , νμλ³ νμ μΌλ‘ κ° μμ ν¨μμ μ°¨μ΄λ₯Ό νμΈν΄λ³΄κ² μ΅λλ€.
CREATE TABLE `students` (
`student_id` int NOT NULL,
`first_name` varchar(50) DEFAULT NULL,
`last_name` varchar(50) DEFAULT NULL,
`major` varchar(100) DEFAULT NULL,
`gpa` decimal(3,2) DEFAULT NULL, // νμ
PRIMARY KEY (`student_id`)
)
μ λΉν λ°μ΄ν°λ₯Ό μ¬λ¬κ° INSERT ν ν μλ 쿼리λ₯Ό μ€νμμΌ λ³΄κ² μ΅λλ€.
SELECT student_id , first_name , gpa
, RANK() OVER (ORDER BY gpa DESC) AS 'RANK'
, DENSE_RANK () OVER (ORDER BY gpa DESC) AS 'DENSE_RANK'
, ROW_NUMBER() OVER (ORDER BY gpa DESC, first_name ASC) AS 'ROW_NUM'
FROM students;
μ€νμν¨ κ²°κ³Όλ μλμ κ°μ΅λλ€.
student_id | first_name | gpa | RANK | DENSE_ RANK | ROW_NUM |
3 | μλ¦° | 3.95 | 1 | 1 | 1 |
2 | λ―Όμ§ | 3.90 | 2 | 2 | 2 |
8 | μ§μ° | 3.90 | 2 | 2 | 3 |
6 | μλ―Ό | 3.85 | 4 | 3 | 4 |
4 | μ§ν | 3.85 | 4 | 3 | 5 |
5 | λ―Όμ€ | 3.80 | 6 | 4 | 6 |
10 | μν¬ | 3.80 | 6 | 4 | 7 |
9 | μΉν | 3.75 | 8 | 5 | 8 |
7 | μ€νΈ | 3.75 | 8 | 5 | 9 |
1 | λ―Όμ | 3.7 | 10 | 6 | 10 |
3,4λ² νμ 보면, 3λ² νμ μ§μ°μ 4λ² νμ μλ―Όμ΄μ μμ κ°μ΄ κ° ν¨μλ³λ‘ λ€λ₯Έ κ²μ νμΈν μ μμ΅λλ€.
κ·Έλ¦¬κ³ κ° ν¨μλ³λ‘ μμλ λ€λ₯΄κ² 맀겨μ§λ κ²μ μ μ μμ΅λλ€.
- RANK: 1 β’ 2 β’ 4 β’ 6 β’ 8 β’ 10
- DENSE_RANK: 1 β’ 2 β’ 3 β’ 4 β’ 5 β’ 6
- ROW_NUM: 1 β’ 2 β’ 3 β’ 4 β’ 5 β’ 6 β’ 7 β’ 8 β’ 9 β’ 10
5. PARTITION BY λ¬Έλ²
μΆκ°λ‘ μΈκ°μ§ ν¨μμμ λͺ¨λ μ΅μ κ°μΌλ‘ μ¬μ©λλ νν°μ ꡬ문μ λν μ¬μ©λ²μ μμλ³΄κ² μ΅λλ€.
PARTITION BYλ κ·Έλ£Ή λ΄ μμ λ° κ·Έλ£Ήλ³ μ§κ³λ₯Ό ꡬν λ μ¬μ©ν©λλ€.
SELECT student_id , major , gpa
,RANK() OVER (PARTITION BY major ORDER BY gpa DESC) AS 'PARTITION'
FROM STUDENTS;
μ΄ μΏΌλ¦¬λ νμλ€μ μ 곡(major)λ³λ‘ νμλ€μ νμ (gpa)μμλ₯Ό λ§€κΉλλ€.
- PARTITION BY major ORDER BY gpa DESC: major 컬λΌμ΄ κ°μ νμ κ·Έλ£ΉμΌλ‘ λ¬Άμ΄μ, κ·Έλ£Ή λ΄ gpa 컬λΌμ μμλ₯Ό λ΄λ¦Όμ°¨μ(DESC)μΌλ‘ μ λ ¬
μ 쿼리λ₯Ό μ€νν κ²°κ³Όλ μλμ κ°μ΅λλ€.
student_id | major | gpa | PARTITION |
1 | κ²½μν | 3.6 | 1 |
8 | κ²½μν | 3.5 | 2 |
7 | κ²½μν | 3.45 | 3 |
4 | κ²½μν | 3.4 | 4 |
9 | μλ¬Όν | 3.2 | 1 |
6 | μλ¬Όν | 3.05 | 2 |
3 | μ¬λ¦¬ν | 3.85 | 1 |
5 | μ¬λ¦¬ν | 3.85 | 1 |
2 | μ¬λ¦¬ν | 3.75 | 3 |
10 | μ¬λ¦¬ν | 3.55 | 4 |
λ§μΉλ©°,
μλμ° ν¨μ μ€ νλμΈ μμ ν¨μμ λν΄ μμ보μμ΅λλ€.
μ½λ©ν μ€νΈλ₯Ό νλ©΄μ RANK() ν¨μλ₯Ό νμ©ν΄μΌνλ 쿼리λ₯Ό μ λλ‘ μμ±νμ§ λͺ»ν΄ λ€μ 곡λΆνλ©΄μ μ 리νλ μ μ 곡λΆνλ λ΄μ©μ΄ λ€μ μκ°λκΈ°λ νκ³ μλ‘κ² λ€μ λ°°μ°κΈ°λ νμ΅λλ€.
κ΄λ ¨ν λ€λ₯Έ ν¨μλ€λ λ§μ΄ μμΌλ, λ€μμλ μ΄μΈ ν¨μλ€λ μ 리νλ μκ°μ κ°μ Έλ³΄μμΌκ² μ΅λλ€ :)
μ°Έκ³ λ§ν¬
A Guide to MySQL RANK Funtion By Practical Examples
This tutorial introduces to the MySQL RANK function and how to apply it to assign the rank to each row within the partition of a result set.
www.mysqltutorial.org
Oracle RANK() Function By Practical Examples
In this tutorial, you will learn how to use Oracle RANK() function to calculate the rank of rows within a set of rows.
www.oracletutorial.com
'π» Programming > SQL' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[SQL] λ μ§ν λ°μ΄ν° - DATETIMEκ³Ό TIMESTAMP μ°¨μ΄λ₯Ό μ€μ μΌλ‘ (MySQL) (0) | 2024.07.11 |
---|