บทช่วยสอนนี้สำรวจวิธีการทำงานกับฟังก์ชัน PostgreSQL เรายังสำรวจไวยากรณ์ของฟังก์ชันและพารามิเตอร์ และดูตัวอย่างที่ใช้งานได้จริง
ฟังก์ชัน PostgreSQL Rank()
ต่อไปนี้แสดงไวยากรณ์ของฟังก์ชัน rank() ใน PostgreSQL:
RANK() มากกว่า (PARTITION BY partition_expression ORDER BY sort_expression [ASC|DESC])
เราเริ่มต้นด้วยการเรียกใช้ฟังก์ชัน rank() จากนั้นเราจะใช้คีย์เวิร์ด OVER เพื่อระบุว่าเราต้องการดำเนินการฟังก์ชันหน้าต่าง
ถัดไปคือ PARTITION BY partition_expression ประโยคนี้แบ่งแถวออกเป็นพาร์ติชันต่างๆ ตามนิพจน์ที่กำหนด การจัดอันดับจะทำแยกกันในแต่ละพาร์ติชันโดยที่ค่าจำนวนเต็มของอันดับเริ่มต้นที่ 1 สำหรับพาร์ติชันใหม่แต่ละพาร์ติชัน
สุดท้าย เรามีคำสั่ง ORDER BY ซึ่งระบุคอลัมน์หรือนิพจน์ที่กำหนดลำดับแถว
ตัวอย่างฟังก์ชัน PostgreSQL Rank()
ข้อความค้นหาต่อไปนี้แสดงตัวอย่างพื้นฐานของการใช้ฟังก์ชัน rank() ของ PostgreSQL:
เลือกค่า RANK() OVER (ORDER BY value) AS rankจาก (
ค่า (10), (20), (5), (15), (10)
) เป็นข้อมูล(ค่า);
ในตัวอย่างนี้ เราจัดอันดับค่าตามลำดับจากน้อยไปหามาก ค่าที่เกิดขึ้นสองครั้งถูกกำหนดด้วยอันดับเดียวกันเนื่องจากมีความคล้ายคลึงกันและปรากฏในตำแหน่งเดียวกันภายในคำสั่งซื้อ
ตารางผลลัพธ์มีดังนี้:
ค่า SELECT, RANK() OVER (PARTITION BY value % 2 ORDER BY value) AS อันดับจาก (
ค่า (10), (20), (5), (15), (10)
) เป็นข้อมูล(ค่า);
ตัวอย่างฟังก์ชัน PostgreSQL Rank() ที่มี Partition By Clause
พิจารณาตัวอย่างต่อไปนี้:
ค่า SELECT, RANK() OVER (PARTITION BY value % 2 ORDER BY value) AS อันดับจาก (
ค่า (10), (20), (5), (15), (10)
) เป็นข้อมูล(ค่า);
ในตัวอย่างนี้ เราเพิ่มส่วนคำสั่ง PARTITION BY ด้วยนิพจน์ที่ตรวจสอบว่าค่านั้นเป็นเลขคู่หรือเลขคี่ สิ่งนี้ควรจัดกลุ่มค่าออกเป็นสองส่วนอย่างมีประสิทธิภาพ: ส่วนหนึ่งสำหรับจำนวนคู่ (โดยที่เศษเป็น 0) และอีกส่วนสำหรับจำนวนคี่ (โดยที่เศษเป็น 1)
ชุดผลลัพธ์มีดังนี้:
ตัวอย่างฟังก์ชัน PostgreSQL Rank() โดยการรวมคุณสมบัติ SQL หลายตัวเข้าด้วยกัน
คุณยังสามารถสร้างข้อความค้นหาที่ซับซ้อนมากขึ้นได้โดยใช้ฟังก์ชัน rank() ตัวอย่างเช่น ใช้ฐานข้อมูล Pagila สมมติว่าเราต้องการเรียกลูกค้าห้าอันดับแรกโดยพิจารณาจากค่าเช่าทั้งหมดและกำหนดอันดับให้กับพวกเขา
เราสามารถใช้ฟังก์ชัน rank() ดังแสดงในแบบสอบถามต่อไปนี้:
เลือก customer_id, first_name, last_name, total_payments,RANK() มากกว่า (ORDER BY total_payments DESC) AS rank
จาก (
เลือก c.customer_id, c.first_name, c.last_name, SUM(p.amount) AS total_payments
จากลูกค้า ค
เข้าร่วมการชำระเงิน p บน c.customer_id = p.customer_id
จัดกลุ่มตาม c.customer_id, c.first_name, c.last_name
) AS customer_payments
ORDER BY อันดับ
จำกัด 10;
ในตัวอย่างนี้ เราเลือก customer_id, first_name, last_name, total_payment และ rank() ที่กำหนด จากนั้น เราใช้ฟังก์ชัน rank() เพื่อกำหนดอันดับให้กับลูกค้าแต่ละรายตามยอดรวมของการชำระเงินที่เรียงลำดับจากมากไปน้อย
ข้อความค้นหาย่อยภายในช่วยให้เราสามารถคำนวณการชำระเงินทั้งหมดสำหรับลูกค้าแต่ละรายโดยเข้าร่วมลูกค้าและตารางการชำระเงิน จากนั้นเราจะจัดกลุ่มผลลัพธ์ตามคอลัมน์ customer_id, first_name และ last_name เพื่อเรียกผลรวมของการชำระเงินสำหรับลูกค้าแต่ละราย
สุดท้าย ในแบบสอบถามภายนอก เราใช้ฟังก์ชัน rank() กับชุดผลลัพธ์และเรียงลำดับตาม total_payments จากน้อยไปหามาก เรายังรวมคำสั่งจำกัดเพื่อดึงเฉพาะแถว 10 อันดับแรก
อย่างที่คุณเห็น คุณสามารถสร้างข้อมูลเชิงลึกได้มากขึ้นโดยการรวมคุณสมบัติ SQL หลายอย่างเข้าด้วยกัน เช่น การเรียงลำดับ การกรอง การรวม การรวม และอื่นๆ
บทสรุป
เราได้สำรวจวิธีที่เราสามารถทำงานร่วมกับฟังก์ชัน rank() ใน PostgreSQL เพื่อดึงข้อมูลอันดับของแถวที่กำหนดจากชุดผลลัพธ์ตามเงื่อนไขที่กำหนด เรายังพูดถึงวิธีการรวมฟังก์ชัน rank() กับเครื่องมือ SQL อื่นๆ เพื่อสร้างเคียวรีที่ซับซ้อนยิ่งขึ้น