OVER, PARTITION BY, ORDER BY
ทำความเข้าใจโมเดลฟังก์ชันหน้าต่าง: OVER, PARTITION BY (จัดกลุ่ม), ORDER BY (เรียงลำดับ) และความแตกต่างจาก GROUP BY
OVER, PARTITION BY, ORDER BY เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ฟังก์ชันหน้าต่างคืออะไร
ฟังก์ชันหน้าต่างคำนวณค่าจากชุดแถวที่เกี่ยวข้องกับแถวปัจจุบัน โดยไม่ยุบผลลัพธ์เหมือนที่ GROUP BY ทำ คุณยังคงได้ทุกแถวและได้คอลัมน์สรุปรวมเพิ่มมาด้วย
ตัวอย่างพื้นฐาน
ค่าเฉลี่ยของยอดคำสั่งซื้อจากทั้งตาราง โดยแสดงในทุกแถว:
SELECT id, total,
AVG(total) OVER () AS avg_total
FROM orders;ส่วนคำสั่ง OVER
ส่วนคำสั่ง OVER (...) ใช้กำหนดหน้าต่าง วงเล็บว่างหมายถึง "ชุดผลลัพธ์ทั้งหมด"
SELECT id, total,
SUM(total) OVER () AS grand_total
FROM orders;PARTITION BY: จัดกลุ่มหน้าต่าง
คล้ายกับ GROUP BY แต่แถวจะไม่ถูกยุบรวม:
SELECT id, user_id, total,
SUM(total) OVER (PARTITION BY user_id) AS user_total
FROM orders;
-- Every order keeps its row; user_total is the same for all of one user's orders.ORDER BY ในหน้าต่าง
ORDER BY ภายใน OVER ใช้กำหนดลำดับแถวสำหรับการคำนวณสะสม:
SELECT id, user_id, total,
SUM(total) OVER (PARTITION BY user_id ORDER BY created_at) AS running_total
FROM orders;
-- Running total per user, ordered by date.หน้าต่างเทียบกับ GROUP BY
เปรียบเทียบกันโดยตรง:
-- GROUP BY: 1 row per user
SELECT user_id, SUM(total) FROM orders GROUP BY user_id;
-- Window: 1 row per order, with user total alongside
SELECT id, user_id, total,
SUM(total) OVER (PARTITION BY user_id)
FROM orders;แต่ละแถวกับกรอบที่แตกต่างกัน
"กรอบ" คือชุดแถวภายในกลุ่มย่อยที่ฟังก์ชันนำมาพิจารณา กรอบเริ่มต้นเมื่อมี ORDER BY คือ "ตั้งแต่ต้นจนถึงแถวปัจจุบัน" ซึ่งเป็นสิ่งที่ทำให้ได้ผลรวมสะสม
หน้าต่างที่มีชื่อ
หากมีหลายฟังก์ชันใช้หน้าต่างเดียวกัน ให้ตั้งชื่อหน้าต่างนั้นเพียงครั้งเดียว:
SELECT id, user_id, total,
SUM(total) OVER w AS running_sum,
AVG(total) OVER w AS running_avg
FROM orders
WINDOW w AS (PARTITION BY user_id ORDER BY created_at);ฟังก์ชันรวมส่วนใหญ่ใช้เป็นฟังก์ชันหน้าต่างได้
COUNT, SUM, AVG, MIN และ MAX ทั้งหมดสามารถใช้กับหน้าต่างได้ ฟังก์ชันหน้าต่างเฉพาะทางยังเพิ่ม ROW_NUMBER, RANK, LAG/LEAD, NTILE และอื่น ๆ
ฟังก์ชันหน้าต่างทำงานหลัง WHERE
ลำดับเชิงตรรกะ: FROM → WHERE → GROUP BY → HAVING → window functions → SELECT → ORDER BY → LIMIT ดังนั้น WHERE จะกรองข้อมูลก่อนคำนวณฟังก์ชันหน้าต่าง
ข้อควรพิจารณาด้านประสิทธิภาพ
ฟังก์ชันหน้าต่างจำเป็นต้องจัดเรียงข้อมูล หรือใช้แฮช สำหรับกลุ่มย่อยขนาดใหญ่ ดัชนีบนคอลัมน์ (กลุ่มย่อย, ลำดับ) จะช่วยหลีกเลี่ยงขั้นตอนการจัดเรียง
สรุป
ฟังก์ชันหน้าต่างเพิ่มค่าสรุปรวมให้แต่ละแถว
- OVER () = ผลลัพธ์ทั้งหมด
- PARTITION BY = จัดกลุ่มหน้าต่าง
- ORDER BY ในหน้าต่าง = เปิดใช้การคำนวณสะสม
ตรวจสอบความเข้าใจ
SUM(x) OVER (PARTITION BY user_id) คำนวณอะไร
คำถามที่พบบ่อย
บทเรียน “OVER, PARTITION BY, ORDER BY” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “OVER, PARTITION BY, ORDER BY” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “OVER, PARTITION BY, ORDER BY”
ทำความเข้าใจโมเดลฟังก์ชันหน้าต่าง: OVER, PARTITION BY (จัดกลุ่ม), ORDER BY (เรียงลำดับ) และความแตกต่างจาก GROUP BY คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “OVER, PARTITION BY, ORDER BY” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- OVER, PARTITION BY, ORDER BY
- ROW_NUMBER, RANK, DENSE_RANK
- LAG, LEAD และรูปแบบอนุกรมเวลา
- ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่