0Pricing
SQL Interview Prep · บทเรียน

NTILE สำหรับแบ่งกลุ่ม

แบ่งแถวเป็นควอร์ไทล์และช่วงเปอร์เซ็นไทล์

NTILE สำหรับแบ่งกลุ่ม เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

เมื่อจำเป็นต้องแบ่งกลุ่มให้มีขนาดเท่ากัน

ผู้สัมภาษณ์อาจถามว่า “แบ่งลูกค้าออกเป็นสี่กลุ่มที่มีค่าใช้จ่ายเท่ากัน” หรือ “แต่ละแถวอยู่ในเดไซล์ใด” เครื่องมือที่ใช้คือ NTILE

NTILE(n) จัดสรรแถวที่เรียงลำดับแล้วลงในกลุ่มจำนวน n กลุ่มให้กระจายเท่า ๆ กันมากที่สุด และกำกับแต่ละแถวด้วยหมายเลขกลุ่มตั้งแต่ 1 ถึง n บทเรียนนี้ครอบคลุมวิธีการแบ่ง การจัดการจำนวนแถวที่แบ่งไม่ลงตัว และความแตกต่างจากการจัดอันดับ

ไวยากรณ์พื้นฐานของ NTILE

NTILE(4) เมื่อใช้กับแถวที่เรียงตามค่าจะสร้างควอร์ไทล์ เช่นเดียวกับฟังก์ชันหน้าต่างทั้งหมด ฟังก์ชันนี้ต้องมีส่วนคำสั่ง OVER และ ORDER BY ภายในจะกำหนดว่าแถวใดอยู่ในกลุ่มค่าต่ำหรือกลุ่มค่าสูง

การเรียงจากน้อยไปมากจะใส่ค่าที่น้อยที่สุดไว้ในกลุ่มที่ 1 ส่วนการเรียงจากมากไปน้อยจะสลับทิศทางดังกล่าว

SELECT
  customer_id,
  total_spend,
  NTILE(4) OVER (ORDER BY total_spend) AS spend_quartile
FROM customers;

NTILE แบ่งแถวอย่างไร

เมื่อมี 12 แถวและใช้ NTILE(4) แต่ละกลุ่มจะมี 12 / 4 = 3 แถวพอดี กลุ่มที่ 1 คือค่าต่ำสุด 3 ค่า ส่วนกลุ่มที่ 4 คือค่าสูงสุด 3 ค่า

แนวคิดสำคัญคือ NTILE แบ่งตาม จำนวนแถว ไม่ใช่ตามช่วงของค่า ดังนั้นสองกลุ่มอาจครอบคลุมช่วงค่าที่แตกต่างกันมากได้ ตราบใดที่มีจำนวนแถวเท่ากัน

การแบ่งที่ไม่ลงตัว

ถ้าจำนวนแถวแบ่งไม่ลงตัวจะเกิดอะไรขึ้น เมื่อมี 10 แถวและใช้ NTILE(4) จะได้ 10 / 4 = 2 เศษ 2 NTILE จะให้ กลุ่มแรก ๆ มีแถวที่เกินมา

  • กลุ่มที่ 1: 3 แถว
  • กลุ่มที่ 2: 3 แถว
  • กลุ่มที่ 3: 2 แถว
  • กลุ่มที่ 4: 2 แถว

ดังนั้นขนาดของกลุ่มจะแตกต่างกันไม่เกินหนึ่งแถว และกลุ่มที่ใหญ่กว่าจะอยู่ก่อน กฎที่แน่นอนนี้เป็นรายละเอียดในการสัมภาษณ์ที่มักถูกถาม

NTILE ไม่รวมค่าที่เท่ากันไว้ด้วยกัน

จุดพลาดสำคัญคือ NTILE ไม่รับประกันว่าค่าที่เท่ากันจะอยู่ในกลุ่มเดียวกัน ฟังก์ชันนี้เติมกลุ่มตามตำแหน่ง ดังนั้นสองแถวที่มีค่า total_spend เท่ากันอาจไปอยู่คนละกลุ่ม เพียงเพราะลำดับแถวแตกต่างกัน

หากธุรกิจต้องการให้ค่าที่เท่ากันอยู่ในระดับเดียวกัน NTILE ไม่ใช่เครื่องมือที่เหมาะสม คุณต้องใช้วิธีที่อิงตามค่าแทน ผู้สัมภาษณ์จงใจวางกับดักนี้ไว้

เดไซล์และเปอร์เซ็นไทล์

จำนวนกลุ่มคือค่าที่คุณส่งเข้าไป NTILE(10) ให้เดไซล์ และ NTILE(100) ให้ช่วงเปอร์เซ็นไทล์ วิธีนี้ใช้แบ่งผู้ใช้ออกเป็นระดับประสิทธิภาพหรือช่วงความเสี่ยง

ผลลัพธ์คือหมายเลขช่วง ดังนั้นค่าที่อยู่ในกลุ่มที่ 9 ของ NTILE(10) จึงอยู่ในเดไซล์ลำดับที่สองจากสูงสุด

SELECT
  user_id,
  score,
  NTILE(10) OVER (ORDER BY score DESC) AS decile
FROM leaderboard;

การแบ่งกลุ่มแยกตามกลุ่มข้อมูล

เพิ่ม PARTITION BY เพื่อแบ่งกลุ่มภายในแต่ละกลุ่มข้อมูลแยกจากกัน เช่น ควอร์ไทล์ของยอดใช้จ่าย ในแต่ละภูมิภาค แต่ละภูมิภาคจะเริ่มนับใหม่ที่กลุ่มที่ 1

วิธีนี้ตอบคำถามอย่าง “ลูกค้าที่อยู่ในควอร์ไทล์สูงสุดของแต่ละภูมิภาค” ได้ แม้ภูมิภาคที่มียอดใช้จ่ายโดยรวมต่ำก็ยังมีกลุ่มที่ 4 เป็นของตนเอง

SELECT
  region,
  customer_id,
  total_spend,
  NTILE(4) OVER (
    PARTITION BY region
    ORDER BY total_spend DESC
  ) AS regional_quartile
FROM customers;

การกรองระดับที่ต้องการ

คุณไม่สามารถใส่ NTILE(...) โดยตรงในส่วนคำสั่ง WHERE ได้ เพราะฟังก์ชันหน้าต่างจะถูกคำนวณหลัง WHERE ให้ครอบคำสั่งสอบถามไว้ใน CTE หรือคำสั่งสอบถามย่อย แล้วจึงกรองจากคอลัมน์กลุ่ม

รูปแบบ “ขอลูกค้าที่ใช้จ่ายอยู่ในควอร์ไทล์สูงสุด” เป็นวิธีที่พบได้บ่อยที่สุดเมื่อใช้ NTILE ในคำตอบจริง

WITH q AS (
  SELECT customer_id, total_spend,
         NTILE(4) OVER (ORDER BY total_spend DESC) AS quartile
  FROM customers
)
SELECT customer_id, total_spend
FROM q
WHERE quartile = 1;

NTILE เทียบกับเปอร์เซ็นไทล์ตามค่า

NTILE แบ่งกลุ่มตามจำนวนแถวที่เท่ากัน หากคุณต้องการเปอร์เซ็นไทล์ทางสถิติที่แท้จริง หรือค่าที่อยู่ ณ เปอร์เซ็นไทล์ที่ 90 ให้ใช้ PERCENTILE_CONT หรือ PERCENTILE_DISC

  • NTILE(100): ระบุว่าตามตำแหน่งอันดับแล้วแถวหนึ่งอยู่ในช่วงเปอร์เซ็นไทล์ใด
  • ฟังก์ชันเปอร์เซ็นไทล์แบบต่อเนื่องที่ 0.9: ค่าจริง ณ เปอร์เซ็นไทล์ที่ 90

การเข้าใจความแตกต่างนี้ช่วยแยกคำตอบที่มั่นใจออกจากการเดา

เมื่อ ORDER BY มีความสำคัญ

NTILE ต้องมี ORDER BY ภายใน OVER เพราะกลุ่มจะไม่มีความหมายหากไม่ได้กำหนดลำดับ ทิศทางการเรียงจะกำหนดว่าด้านใดเป็นกลุ่มที่ 1

หากค่าที่เท่ากันทำให้การจัดกลุ่มไม่ชัดเจน และตำแหน่งกลุ่มที่แน่นอนของแถวบริเวณรอยต่อมีความสำคัญ ให้เพิ่มคอลัมน์ใช้ตัดสินกรณีเสมอลงในการจัดลำดับ เพื่อให้ได้ผลลัพธ์ที่แน่นอนและทำซ้ำได้

กำกับกลุ่มด้วยชื่อ

หมายเลขกลุ่มดิบ (1, 2, 3, 4) แทบไม่ใช่ผลลัพธ์สุดท้าย นักวิเคราะห์มักแปลงหมายเลขเหล่านี้เป็นป้ายกำกับทางธุรกิจ เช่น ต่ำ ปานกลาง สูง และสูงสุด ด้วยนิพจน์ CASE ที่ใช้กับผลลัพธ์ของ NTILE

คำนวณ NTILE ใน CTE แล้วแปลงหมายเลขในคำสั่งสอบถามภายนอก วิธีนี้ทำให้ตรรกะของฟังก์ชันหน้าต่างชัดเจนและทำให้ผลลัพธ์พร้อมนำเสนอ

WITH q AS (
  SELECT customer_id, total_spend,
         NTILE(4) OVER (ORDER BY total_spend) AS bucket
  FROM customers
)
SELECT customer_id, total_spend,
  CASE bucket
    WHEN 1 THEN 'Low'
    WHEN 2 THEN 'Medium'
    WHEN 3 THEN 'High'
    WHEN 4 THEN 'Top'
  END AS spend_tier
FROM q;

ตรวจสอบความเข้าใจ

ทดสอบกฎการกระจายที่ไม่เท่ากัน

สรุปทบทวน

NTILE แบ่งแถวที่เรียงลำดับแล้วออกเป็นกลุ่มที่มีจำนวนแถวเท่ากัน:

  • NTILE(n) กำกับแถวด้วยหมายเลข 1..n โดย NTILE(4) คือควอร์ไทล์ และ NTILE(10) คือเดไซล์
  • ฟังก์ชันนี้แบ่งตามจำนวนแถว ไม่ใช่ช่วงของค่า และให้แถวที่เกินมากับกลุ่มแรก ๆ
  • ฟังก์ชันนี้ไม่รวมค่าที่เท่ากันไว้ด้วยกัน และไม่สามารถใส่โดยตรงใน WHERE ได้
  • หากต้องการค่าของเปอร์เซ็นไทล์ที่แท้จริง ให้ใช้ PERCENTILE_CONT

ต่อไป: การดึงค่าที่ขอบเขตด้วย FIRST_VALUE ฟังก์ชันค่าท้ายสุด และขอบเขตเฟรม

คำถามที่พบบ่อย

บทเรียน “NTILE สำหรับแบ่งกลุ่ม” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “NTILE สำหรับแบ่งกลุ่ม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “NTILE สำหรับแบ่งกลุ่ม”

แบ่งแถวเป็นควอร์ไทล์และช่วงเปอร์เซ็นไทล์ คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “NTILE สำหรับแบ่งกลุ่ม” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม

ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. LAG และ LEAD สำหรับแถวที่อยู่ติดกัน
  2. การเปลี่ยนแปลงระหว่างช่วงเวลา
  3. NTILE สำหรับแบ่งกลุ่ม
  4. FIRST_VALUE, LAST_VALUE และขอบเขตเฟรม
← กลับไปที่ SQL Interview Prep