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;