0Pricing
SQL Academy · บทเรียน

เงื่อนไขกรอบ: 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 PRECEDING
  • CURRENT ROW
  • n FOLLOWING
  • UNBOUNDED 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เงื่อนไขกรอบ: ROWS เทียบกับ RANGE
  2. Lag/Lead กับหน้าต่างกรอบ
  3. การแบ่งกลุ่มด้วย NTILE และ Cume_Dist
  4. รูปแบบการทำรายงานจากสถานการณ์จริง
← กลับไปที่ SQL Academy