Window Function ช่วยคำนวณข้อมูลข้ามหลายแถวโดยไม่รวมแถวให้เหลือผลลัพธ์เดียวเหมือน GROUP BY จึงเหมาะสำหรับการจัดอันดับ การคำนวณยอดสะสม และการเปรียบเทียบค่ากับแถวก่อนหน้า

ควรใช้เมื่อไร

  • จัดอันดับยอดขายรายเดือน
  • คำนวณยอดสะสมโดยยังคงแสดงรายละเอียดของทุกรายการ
  • เปรียบเทียบค่าปัจจุบันกับค่าของแถวก่อนหน้า

จำง่าย: PARTITION BY ใช้แบ่งข้อมูลออกเป็นกลุ่ม ส่วน ORDER BY ใช้กำหนดลำดับของข้อมูลภายในแต่ละหน้าต่าง

ตัวอย่าง: จัดอันดับสินค้า

sql
SELECT
  category,
  product_name,
  revenue,
  DENSE_RANK() OVER (
    PARTITION BY category
    ORDER BY revenue DESC
  ) AS revenue_rank
FROM product_sales;

ROW_NUMBER, RANK และ DENSE_RANK ต่างกันอย่างไร? ROW_NUMBER จะกำหนดหมายเลขลำดับที่ไม่ซ้ำกันให้แต่ละแถว ส่วน RANK จะเว้นลำดับถัดไปเมื่อมีคะแนนเท่ากัน และ DENSE_RANK จะไม่เว้นลำดับหลังคะแนนที่เท่ากัน

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

Test

text
SELECT
category,
product_name
FROM product_sales;