เงื่อนไขกรอบ: ROWS เทียบกับ RANGE
เลือกระหว่างเงื่อนไขกรอบ ROWS BETWEEN กับ RANGE BETWEEN และทำความเข้าใจว่าแต่ละแบบจัดการข้อมูลซ้ำและช่องว่างอย่างไร
เงื่อนไขกรอบ: ROWS เทียบกับ RANGE เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
กรอบภายใน OVER
ฟังก์ชันหน้าต่างจะประเมินผลเหนือกรอบ ซึ่งเป็นส่วนย่อยของแถวจากพาร์ทิชัน กรอบนี้กำหนดด้วย:
OVER (
PARTITION BY ...
ORDER BY ...
ROWS BETWEEN <start> AND <end> -- or RANGE BETWEEN ...
)กรอบเริ่มต้น
หากระบุ ORDER BY แต่ไม่ระบุกรอบ ค่าเริ่มต้นคือ:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
-- "From the first row up to all rows tied with the current row".ROWS นับตามตำแหน่งจริง
ROWS นับแถว N แถวตามลำดับของพาร์ทิชัน โดยไม่คำนึงถึงค่า:
SUM(x) OVER (ORDER BY day ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
-- The current row plus the previous 2. Exactly 3 rows.RANGE นับตามค่า
RANGE นับแถวที่ค่าของ ORDER BY อยู่ภายในช่วงรอบค่าปัจจุบัน:
SUM(x) OVER (
ORDER BY day
RANGE BETWEEN INTERVAL '2 days' PRECEDING AND CURRENT ROW
)
-- All rows within 2 days (by calendar) of the current row.เหตุใดความแตกต่างนี้จึงสำคัญ
หากข้อมูลมีช่องว่าง ROWS และ RANGE จะให้คำตอบต่างกัน:
-- Days: 1, 3, 5 (no 2 or 4)
-- ROWS BETWEEN 2 PRECEDING AND CURRENT ROW for day 5: rows 1,3,5 = 3 days
-- RANGE BETWEEN INTERVAL '2 days' PRECEDING for day 5: only days 3,5 = 2 daysกรอบ GROUPS (PG 11 ขึ้นไป)
GROUPS นับกลุ่มแถวที่มีค่าเท่ากัน (ค่าที่เสมอกันใน ORDER BY) แทนการนับแถวแต่ละแถว:
SUM(x) OVER (
ORDER BY tier
GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
)
-- "The current tier and the previous tier" — useful when ORDER BY has many ties.ขอบเขตของกรอบ
UNBOUNDED PRECEDING— แถวแรกของพาร์ทิชันn PRECEDINGCURRENT ROWn FOLLOWINGUNBOUNDED FOLLOWING— แถวสุดท้าย
ผลรวมสะสม
รวมค่าตั้งแต่จุดเริ่มต้นจนถึงแถวนี้:
SUM(x) OVER (ORDER BY day ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-- Same as the default frame.หน้าต่างย้อนหลัง
ค่าเฉลี่ยย้อนหลัง N วัน:
AVG(revenue) OVER (
ORDER BY day
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS avg_7dหน้าต่างแบบมีจุดศูนย์กลาง
พิจารณาทั้งสองทิศทาง:
AVG(revenue) OVER (
ORDER BY day
ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING
) AS centred_7dเรื่องน่าประหลาดใจของ LAST_VALUE
LAST_VALUE ที่ใช้กับกรอบเริ่มต้นจะส่งคืนแถวปัจจุบัน ไม่ใช่แถวสุดท้ายในพาร์ทิชัน ให้ใช้กรอบแบบไม่จำกัดที่ระบุอย่างชัดเจน:
LAST_VALUE(name) OVER (
PARTITION BY group ORDER BY day
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)ข้อคำสั่ง EXCLUDE (PG 11 ขึ้นไป)
ข้ามแถวบางรายการในกรอบ:
SUM(x) OVER (
ORDER BY day
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
EXCLUDE CURRENT ROW
)
-- All previous 6 days but not today.สรุปทบทวน
ข้อกำหนดกรอบช่วยควบคุมหน้าต่างได้อย่างแม่นยำ
- ROWS — จำนวนแถวจริง
- RANGE — ช่วงที่อิงตามค่า
- GROUPS — กลุ่มแถวที่มีค่าเท่ากัน
- กรอบเริ่มต้นอาจทำให้ประหลาดใจ ควรระบุให้ชัดเจน
ตรวจสอบอย่างรวดเร็ว
คุณมีรายได้รายวันที่ขาดบางวัน กรอบใดจะให้ “แถวทั้งหมดภายใน 7 วันตามปฏิทินก่อนหน้านี้จนถึงปัจจุบัน”
คำถามที่พบบ่อย
บทเรียน “เงื่อนไขกรอบ: ROWS เทียบกับ RANGE” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เงื่อนไขกรอบ: ROWS เทียบกับ RANGE” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เงื่อนไขกรอบ: ROWS เทียบกับ RANGE”
เลือกระหว่างเงื่อนไขกรอบ ROWS BETWEEN กับ RANGE BETWEEN และทำความเข้าใจว่าแต่ละแบบจัดการข้อมูลซ้ำและช่องว่างอย่างไร คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “เงื่อนไขกรอบ: ROWS เทียบกับ RANGE” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เงื่อนไขกรอบ: ROWS เทียบกับ RANGE
- Lag/Lead กับหน้าต่างกรอบ
- การแบ่งกลุ่มด้วย NTILE และ Cume_Dist
- รูปแบบการทำรายงานจากสถานการณ์จริง