RANK() เป็น Window Function (MySQL 8.0+) ให้ Rank ต่อแถวใน Partition สามารถ Tie ได้ (ค่าเท่ากัน Rank เดียวกัน ข้าม Rank ถัดไป)
สร้างตารางและข้อมูล
mysql> CREATE TABLE RankDemo (id INT); mysql> INSERT INTO RankDemo VALUES (1), (3), (3), (4), (5);
ใช้ RANK()
mysql> SELECT
-> id,
-> RANK() OVER (ORDER BY id) AS Ranking
-> FROM RankDemo;
ผลลัพธ์:
+------+---------+ | id | Ranking | +------+---------+ | 1 | 1 | | 3 | 2 | | 3 | 2 | -- Tie: Rank 2 ซ้ำ 2 ครั้ง | 4 | 4 | -- ข้าม Rank 3 ไป 4 ทันที | 5 | 5 | +------+---------+
ฟังก์ชัน Ranking อื่นๆ
| Function | พฤติกรรม Tie | ตัวอย่าง (1,3,3,4,5) |
|---|---|---|
RANK() | Same Rank, Skip Next | 1, 2, 2, 4, 5 |
DENSE_RANK() | Same Rank, No Skip | 1, 2, 2, 3, 4 |
ROW_NUMBER() | Always Unique | 1, 2, 3, 4, 5 |
ใช้ PARTITION BY (Rank ภายในกลุ่ม)
SELECT department, employee, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank FROM employees;
หมายเหตุ: Window Functions ต้อง MySQL 8.0+ ไม่ทำงานใน 5.7 ต้องใช้ Variable/Subquery แทน (ซับซ้อนและช้ากว่า)