Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: สร้างลำดับที่ (Rank) ใน SELECT ด้วย ROW_NUMBER()


คำอธิบาย

MySQL 8.0+ รองรับ Window Function ROW_NUMBER() สำหรับสร้างลำดับที่ (Rank) ภายในกลุ่มข้อมูล (Partition) ได้อย่างง่ายดาย

ขั้นตอนการสร้างตารางและข้อมูลตัวอย่าง

mysql> create table DemoTable ( 
    Name varchar(40) ); 
Query OK, 0 rows affected (0.49 sec)

การเพิ่มข้อมูล (มีชื่อซ้ำ)

mysql> insert into DemoTable values('Chris'); 
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Chris'); 
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values('Chris'); 
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('Robert'); 
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Robert'); 
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Adam'); 
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Adam'); 
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values('Adam'); 
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable values('Adam'); 
Query OK, 1 row affected (0.08 sec)

แสดงข้อมูลทั้งหมด

mysql> select * from DemoTable;

ผลลัพธ์:

+--------+
| Name   |
+--------+
| Chris  |
| Chris  |
| Chris  |
| Robert |
| Robert |
| Adam   |
| Adam   |
| Adam   |
| Adam   |
+--------+
9 rows in set (0.00 sec)

คิวรี่สร้าง Rank แบบ Partition by Name

mysql> select Name, row_number() over (partition by Name) as `Rank` 
from DemoTable;

ผลลัพธ์

+--------+------+
| Name   | Rank |
+--------+------+
| Adam   | 1    |
| Adam   | 2    |
| Adam   | 3    |
| Adam   | 4    |
| Chris  | 1    |
| Chris  | 2    |
| Chris  | 3    |
| Robert | 1    |
| Robert | 2    |
+--------+------+
9 rows in set (0.00 sec)

คำอธิบาย

  • PARTITION BY Name: เริ่มนับใหม่ทุกครั้งที่ชื่อเปลี่ยน
  • ROW_NUMBER(): ให้ลำดับที่ 1, 2, 3... ภายในแต่ละกลุ่ม
  • ไม่ต้องมี ORDER BY ใน OVER() ก็ได้ แต่เพิ่มได้หากต้องการเรียงลำดับเฉพาะในกลุ่ม

ฟังก์ชัน Window Function อื่นๆ ที่เกี่ยวข้อง

  • RANK(): ให้ลำดับเท่ากันหากค่าเท่ากัน แล้วข้ามหมายเลขถัดไป
  • DENSE_RANK(): ให้ลำดับเท่ากันหากค่าเท่ากัน แต่อย่าข้ามหมายเลข