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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- LAG และ LEAD สำหรับแถวที่อยู่ติดกัน
- การเปลี่ยนแปลงระหว่างช่วงเวลา
- NTILE สำหรับแบ่งกลุ่ม
- FIRST_VALUE, LAST_VALUE และขอบเขตเฟรม