PlusMagi's Blog By Pitt Phunsanit Ai,Database Advanced SQL: การใช้งาน Window Functions ROW_NUMBER(), RANK() และ DENSE_RANK() ในงาน Analytics

Advanced SQL: การใช้งาน Window Functions ROW_NUMBER(), RANK() และ DENSE_RANK() ในงาน Analytics

ในโลกของการวิเคราะห์ข้อมูลเชิงลึก (Advanced Analytics) การดึงเอาลำดับชั้น ความสำคัญ หรือการเปรียบเทียบผลงานระหว่างรายการย่อย ๆ ในชุดข้อมูลขนาดใหญ่ ถือเป็นหัวใจสำคัญที่แยกนักวิเคราะห์ข้อมูลทั่วไปออกจากผู้เชี่ยวชาญระดับสูง ข้อมูลดิบเพียงอย่างเดียวไม่สามารถนำไปสู่การตัดสินใจทางธุรกิจได้ หากเราขาดเครื่องมือในการจัดลำดับและเปรียบเทียบค่าในบริบทของกลุ่มย่อย (Group Context)

นี่คือจุดที่ Window Functions เข้ามามีบทบาทสำคัญ Window Functions คือฟังก์ชันขั้นสูงในภาษา SQL ที่ช่วยให้คุณสามารถคำนวณค่ารวม (Aggregate) หรือจัดลำดับข้อมูล โดยการคำนวณนั้นจะเกิดขึ้นกับชุดของแถวข้อมูลที่เกี่ยวข้อง (เรียกว่า ‘Window’) แต่ที่แตกต่างจากการใช้ GROUP BY ตรงที่มันจะไม่ยุบรวมแถวนั้น ๆ ให้เหลือเพียงแถวเดียว ทำให้เราสามารถรักษารายละเอียดของแต่ละรายการไว้ได้พร้อมกับการวิเคราะห์เชิงกลุ่ม

💡 หลักการทำงานของ Window Functions ใน PostgreSQL

โครงสร้างหลักของการใช้ Window Function คือ FUNCTION() OVER (PARTITION BY column ORDER BY column):

  • OVER(): เป็นคำสั่งที่กำหนดขอบเขตของหน้าต่างข้อมูลที่จะทำการคำนวณ
  • PARTITION BY: กำหนดกลุ่มย่อย (Partition) ที่ต้องการให้ฟังก์ชันทำงานแยกกัน เช่น การหาอันดับพนักงานขายที่ดีที่สุด ‘ในแต่ละสาขา’
  • ORDER BY: กำหนดลำดับการเรียงข้อมูลภายใน Partition นั้น ๆ ซึ่งสำคัญมากสำหรับการจัดอันดับหรือคำนวณ Running Total

📊 3 ฟังก์ชันหลักในการจัดอันดับ (Ranking Functions)

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

  1. ROW_NUMBER(): กำหนดหมายเลขลำดับที่ไม่ซ้ำกัน (Unique) ให้กับทุกแถวเสมอ ไม่ว่าค่าจะซ้ำหรือไม่ก็ตาม เหมาะสำหรับการกำหนดลำดับที่แน่นอน เช่น ลำดับการเข้าชม
  2. RANK(): จัดอันดับโดยให้คะแนนเท่ากันในกรณีที่มีค่าซ้ำ แต่จะมีการเว้นช่องว่างของหมายเลขถัดไป (เช่น อันดับ 1, 2, 2, 4) เหมาะกับการจัดอันดับที่ต้องการแสดงความห่างของตำแหน่ง
  3. DENSE_RANK(): จัดอันดับอย่างต่อเนื่องโดยไม่มีการเว้นช่องว่างแม้จะมีค่าซ้ำก็ตาม (เช่น อันดับ 1, 2, 2, 3) เป็นฟังก์ชันที่นิยมใช้ที่สุดในการหา Top N เพราะให้ผลลัพธ์ที่กระชับและสมเหตุสมผล

🚀 ตัวอย่างการใช้งานจริงด้วย PostgreSQL

สมมติว่าเรามีตารางข้อมูลยอดขาย (Sales) และต้องการหาพนักงานขายที่มีอันดับสูงสุด 3 อันดับแรกในแต่ละภูมิภาค (Region) โดยใช้ PostgreSQL:

SQL

WITH sales_data AS (
    SELECT 
        employee_name, 
        region, 
        sales_amount
    FROM 
        sales_table
)
SELECT
    employee_name,
    region,
    sales_amount,
    ROW_NUMBER() OVER (PARTITION BY region ORDER BY sales_amount DESC) AS row_num,
    RANK() OVER (PARTITION BY region ORDER BY sales_amount DESC) AS rank_score,
    DENSE_RANK() OVER (PARTITION BY region ORDER BY sales_amount DESC) AS dense_rank_score
FROM 
    sales_data
ORDER BY
    region, sales_amount DESC;

คำอธิบายโค้ด: โค้ดนี้จะแบ่งข้อมูลออกเป็นกลุ่มย่อยตาม region (Partition) จากนั้นภายในแต่ละภูมิภาค จะทำการจัดอันดับยอดขายจากมากไปน้อย (ORDER BY sales_amount DESC) ทำให้เราได้หมายเลขลำดับทั้งสามแบบในแถวเดียวกัน ซึ่งช่วยให้การเปรียบเทียบและตัดสินใจทำได้อย่างรวดเร็ว

✨ บทสรุป: ยกระดับจากการดึงข้อมูลสู่การสร้าง Insight

การเชี่ยวชาญ Window Functions ไม่ได้เป็นเพียงแค่ความรู้ทางเทคนิคของภาษา SQL เท่านั้น แต่คือการติดอาวุธให้เราสามารถคิดวิเคราะห์ข้อมูลในมิติที่ลึกกว่าการรวมยอด (Aggregation) ทั่วไป มันช่วยยกระดับบทบาทของเราจากผู้ดึงข้อมูล (Data Extractor) ไปสู่ผู้สร้าง Insight ที่แท้จริง ไม่ว่าจะเป็นการหา Top N Per Group, การคำนวณ Running Total หรือการระบุค่าผิดปกติ (Anomaly Detection) ด้วย Window Functions ทำให้ทุกรายงานที่เราส่งออกไปมีน้ำหนักและนำไปสู่การตัดสินใจทางธุรกิจที่มีประสิทธิภาพสูงสุดในระดับ Senior Architect

Exit mobile version