ฟังก์ชั่นหน้าต่างหมายเลขแถวของ MySQL

Mysql Row Number Window Function



ภายใน MySQL เมธอด ROW NUMBER() จะมีหมายเลขตามลำดับเวลาสำหรับทุกแถวภายในพาร์ติชั่น มันเป็นเพียงคุณสมบัติของหน้าต่างบางชนิด ตัวเลขของแถวเริ่มต้นที่ 1 ด้วยตัวเลขของแถวภายในพาร์ติชัน โปรดจำไว้ว่า ก่อนเวอร์ชัน 8.0 MySQL ไม่อนุญาตให้ใช้ฟังก์ชัน ROW NUMBER() อย่างไรก็ตาม มีตัวแปรเซสชันที่ช่วยเลียนแบบคุณลักษณะนี้ เราจะเข้าใจเพิ่มเติมเกี่ยวกับฟังก์ชัน MySQL ROW NUMBER() ตลอดคู่มือนี้ และสร้างตัวเลขต่อเนื่องกันสำหรับทุกแถวในคอลเล็กชันผลลัพธ์ ใน MySQL เมธอด ROW_NUMBER() ใช้กับอนุประโยคที่ตามมา:

  • ประโยค Over() จะถูกใช้ภายในนั้น
  • คำสั่ง BY จัดเรียงผลลัพธ์ตามลำดับการเรียงลำดับของคอลัมน์ที่กล่าวถึง

ไวยากรณ์:

>> เลือก col_name,ROW_NUMBER()เกิน( พาร์ทิชั่น โดย col_name, สั่งโดย col_name) เช่น row_num จาก table_name;

ให้เราเปิดเปลือกไคลเอนต์บรรทัดคำสั่ง MySQL จากแอปพลิเคชันและพิมพ์รหัสผ่านเพื่อเข้าสู่ระบบ









คุณต้องสร้างตารางใหม่หรือใช้ตารางเริ่มต้นเพื่อเริ่มทำงานกับฟังก์ชันหมายเลขแถว ดังที่แสดงในภาพด้านล่าง เรามีสัตว์ในตารางในข้อมูลสคีมาพร้อมระเบียนบางส่วนในนั้น มาดึงข้อมูลของมันโดยใช้คำสั่ง SELECT



>> เลือก * จาก ข้อมูล .สัตว์;





ตัวอย่าง 01: ROW_NUMBER() ใช้ ORDER BY Clause

เราจะใช้ตารางเดียวกันเพื่ออธิบายตัวอย่างฟังก์ชันหมายเลขแถวอย่างละเอียด เรากำลังยกตัวอย่างของฟังก์ชัน ROW_NUMBER() ตามด้วย Over() ในขณะที่ใช้เฉพาะคำสั่ง ORDER BY เท่านั้น เราได้ดึงข้อมูลทั้งหมดในขณะที่กำหนดหมายเลขแถวตามคอลัมน์ ลำดับราคา เราได้ตั้งชื่อ row_num ให้กับคอลัมน์ ซึ่งจะเก็บหมายเลขของแถว ลองใช้คำสั่งด้านล่างเพื่อทำเช่นนั้น

>> เลือก *,ROW_NUMBER()เกิน( สั่งโดย ราคา) เช่น row_num จาก ข้อมูล .สัตว์;

เมื่อดำเนินการแบบสอบถามข้างต้น เราจะเห็นว่าแถวได้รับการกำหนดตัวเลขตามลำดับการจัดเรียงของคอลัมน์ราคา คุณอาจคิดว่าราคาที่น้อยกว่าควรอยู่ที่ด้านบนของคอลัมน์และควรจัดเรียงตามนั้น แต่ส่วนคำสั่ง ORDER BY จะเห็นเฉพาะตัวเลขตัวแรกหรือตัวอักษรของคอลัมน์เพื่อจัดเรียงค่า



ให้ดำเนินการค้นหาเดียวกันตามด้วยคำสั่ง ORDER BY ในขณะที่ใช้ลำดับการจัดเรียงของคอลัมน์อายุ ผลลัพธ์จะได้รับตามคอลัมน์อายุ

>> เลือก *,ROW_NUMBER()เกิน( สั่งโดย อายุ) เช่น row_num จาก ข้อมูล .สัตว์;

ตัวอย่าง 02: ROW_NUMBER() การใช้ PARTITION BY Clause

เราจะใช้ส่วนคำสั่ง PARTITION BY เพียงส่วนเดียวในการสืบค้น ROW_NUMBER() เพื่อตรวจสอบผลลัพธ์ เราใช้คำสั่ง SELECT เพื่อดึงข้อมูลเร็กคอร์ดตามด้วย ROW_NUMBER() และ OVER clause ในขณะที่แบ่งพาร์ติชั่นตารางตามคอลัมน์ Color ดำเนินการคำสั่งต่อท้ายด้านล่างในเชลล์คำสั่ง

>> เลือก *,ROW_NUMBER()เกิน( พาร์ทิชั่น ตามสี) เช่น row_num จาก ข้อมูล .สัตว์;

คุณสามารถเห็นในผลลัพธ์ที่มีการกำหนดหมายเลขของแถวในพาร์ติชั่น ตามลำดับการเรียงลำดับสี เนื่องจากเรามี 4 ค่าสำหรับสีดำที่ใช้เวลา 4 แถว นั่นเป็นเหตุผลว่าทำไมจึงมีตัวเลขสี่แถวตั้งแต่ 1 ถึง 4 และในทางกลับกัน

ลองใช้ตัวอย่างเดียวกันโดยแบ่งตามคอลัมน์ Gender ในครั้งนี้ อย่างที่เราทราบกันดีอยู่แล้วว่าตารางนี้มีเพียงสองเพศเท่านั้น นั่นเป็นสาเหตุที่ทำให้เกิดการแบ่งพาร์ติชัน 2 ส่วน ตัวเมียมี 9 แถว จึงมีแถวตั้งแต่ 1 ถึง 9 ในขณะที่ตัวผู้มีค่า 8 ค่า จึงมี 1 ถึง 8

>> เลือก *,ROW_NUMBER()เกิน( พาร์ทิชั่น จำแนกตามเพศ) เช่น row_num จาก ข้อมูล .สัตว์;

ตัวอย่าง 03: ROW_NUMBER() การใช้ PARTITION BY & ORDER BY

เราได้ทำสองตัวอย่างข้างต้นในบรรทัดคำสั่ง MySQL ตอนนี้ถึงเวลาที่จะทำตัวอย่าง ROW_NUMBER() ใน MySQL Workbench 8.0 ดังนั้นให้เปิด MySQL Workbench 8.0 จากแอปพลิเคชัน เชื่อมต่อ MySQL Workbench กับฐานข้อมูลรูทโฮสต์ในเครื่องเพื่อเริ่มทำงาน

ที่ด้านซ้ายของ MySQL Workbench คุณจะพบแถบ Schema เป่าเนวิเกเตอร์ ในแถบสคีมานี้ คุณจะพบรายการฐานข้อมูล ภายใต้รายการฐานข้อมูล คุณจะมีตารางและขั้นตอนการจัดเก็บที่แตกต่างกัน ดังที่คุณเห็นในภาพด้านล่าง เรามีตารางที่แตกต่างกันใน 'ข้อมูล' ฐานข้อมูลของเรา เราจะเปิดตาราง 'order1' โดยใช้คำสั่ง SELECT ในพื้นที่สืบค้นเพื่อเริ่มใช้งานสำหรับฟังก์ชัน ROW_NUMBER()

>> เลือก * จาก ข้อมูล .order1;

ลำดับตารางที่ 1 ถูกแสดงในมุมมองตารางดังที่แสดงด้านล่าง คุณจะเห็นว่ามี 4 คอลัมน์ id, Region, Status และ OrderNo. เราจะดึงบันทึกทั้งหมดของตารางนี้ในขณะที่ใช้คำสั่ง ORDER BY และ PARTITION BY ทั้งสองอย่างพร้อมกัน

ในพื้นที่การสืบค้นของ MySQL Workbench 8.0 ให้พิมพ์ข้อความค้นหาที่แสดงด้านล่าง แบบสอบถามเริ่มต้นด้วยส่วนคำสั่ง SELECT โดยดึงข้อมูลระเบียนทั้งหมดตามด้วยฟังก์ชัน ROW_NUMBER() พร้อมกับส่วนคำสั่ง OVER หลังจากคำสั่ง OVER เราได้ระบุคอลัมน์ Status ที่ดำเนินการโดยคำสั่ง PARTITION BY เพื่อแบ่งตารางออกเป็นพาร์ติชั่นตามตารางนี้ คำสั่ง ORDER BY ถูกใช้เพื่อจัดเรียงตารางจากมากไปหาน้อยตามคอลัมน์ Region หมายเลขแถวจะถูกเก็บไว้ในคอลัมน์ row_num แตะที่ไอคอนแฟลชเพื่อดำเนินการคำสั่งนี้

ผลลัพธ์ที่แสดงด้านล่างจะแสดงขึ้น ก่อนอื่น ตารางถูกแบ่งออกเป็นสองส่วนตามค่าของสถานะคอลัมน์ หลังจากนั้นจะแสดงในลำดับจากมากไปน้อยของคอลัมน์ 'ภูมิภาค' และกำหนดพาร์ติชั่นด้วยหมายเลขแถว

บทสรุป:

สุดท้าย เราได้เสร็จสิ้นตัวอย่างที่จำเป็นทั้งหมดในการใช้ฟังก์ชัน ROW_NUMBER() ใน MySQL Workbench และ MySQL Command-line Client Shell