ตั้งแต่ MySQL 8.0 รองรับ Window Function ROW_NUMBER() ซึ่งสามารถสร้างหมายเลขลำดับ (Rank) ให้กับแถวในผลลัพธ์ได้โดยไม่ต้องใช้ตัวแปรหรือ Subquery ซับซ้อน
รูปแบบคำสั่ง
SELECT column, ROW_NUMBER() OVER (ORDER BY sort_column) as Rank FROM table;
ตัวอย่างการใช้งาน
สร้างตารางคะแนน:
mysql> create table DemoTable1342 (Score int); mysql> insert into DemoTable1342 values(80),(98),(78),(89);
ข้อมูลต้นฉบับ:
+-------+ | Score | +-------+ | 80 | | 98 | | 78 | | 89 | +-------+
คำสั่งเพิ่ม Rank เรียงคะแนนมากไปน้อย
mysql> select Score, row_number() over() as `Rank` from DemoTable1342 order by Score DESC;
ผลลัพธ์
+-------+------+ | Score | Rank | +-------+------+ | 98 | 1 | | 89 | 2 | | 80 | 3 | | 78 | 4 | +-------+------+
คำอธิบายเพิ่มเติม:
ROW_NUMBER() OVER ()ใช้การจัดลำดับตาม ORDER BY ของ Query หลัก (ที่นี่คือORDER BY Score DESC)- สามารถระบุ
OVER (PARTITION BY group_col ORDER BY sort_col)เพื่อ Reset ลำดับในแต่ละกลุ่ม - Window Functions อื่นๆ:
RANK(),DENSE_RANK(),NTILE(),LAG(),LEAD() - MySQL 5.7 หรือเก่ากว่า: ต้องใช้ตัวแปร
SET @rownum=0; SELECT @rownum:=@rownum+1 AS rank, ...