นับและกรองกลุ่ม
ค้นหากลุ่มที่ผ่านเกณฑ์ ซึ่งเป็นโจทย์มาตรฐานเรื่องลูกค้าที่มีคำสั่งซื้อมากกว่า N รายการ
นับและกรองกลุ่ม เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คำถามเรื่องการจัดกลุ่มที่พบบ่อยที่สุด
‘ค้นหาลูกค้าที่มีคำสั่งซื้อมากกว่า N รายการ’ คือโจทย์มาตรฐานเกี่ยวกับ GROUP BY ในการสัมภาษณ์งาน รูปแบบอื่น ๆ ก็พบอยู่เสมอ เช่น สินค้าที่ขายได้มากกว่า X ครั้ง แผนกที่มีพนักงานอย่างน้อย Y คน หรือวันที่มีการเข้าสู่ระบบมากกว่า Z ครั้ง
ทุกกรณีใช้รูปแบบเดียวกัน: จัดกลุ่ม นับจำนวน แล้วกรองกลุ่มด้วย HAVING
ขั้นที่หนึ่ง: นับจำนวนต่อกลุ่ม
เริ่มด้วยการนับแถวภายในแต่ละกลุ่ม จัดกลุ่มตามคีย์ที่กำหนดว่าเป็น ‘ลูกค้า’ หรือ ‘สินค้า’ จากนั้นใช้ COUNT(*)
ผลลัพธ์คือหนึ่งแถวต่อกลุ่มพร้อมขนาดของกลุ่มนั้น คุณยังไม่ได้กรอง เพียงแค่วัดขนาดของแต่ละกลุ่ม
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id;ขั้นที่สอง: กรองด้วย HAVING
ตอนนี้ให้เก็บไว้เฉพาะกลุ่มที่ตรงตามเกณฑ์ เงื่อนไขนี้ใช้กับค่ารวม จึงต้องอยู่ใน HAVING ไม่ใช่ WHERE
ให้ตีความว่า ‘จัดกลุ่มคำสั่งซื้อตามลูกค้า แล้วเก็บเฉพาะลูกค้าที่มีจำนวนมากกว่าห้า’ นี่คือคำตอบที่สมบูรณ์สำหรับโจทย์คลาสสิกนี้
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;นับค่าที่ไม่ซ้ำเทียบกับนับทั้งหมด
โปรดสังเกตถ้อยคำ ‘ลูกค้าที่สั่งซื้อสินค้าที่แตกต่างกันมากกว่า 3 รายการ’ ต้องใช้ COUNT(DISTINCT product_id) ไม่ใช่ COUNT(*)
COUNT(*)นับจำนวนแถวในกลุ่มCOUNT(DISTINCT col)นับค่าที่ไม่ซ้ำและไม่ใช่ NULL
ผู้สัมภาษณ์มักแทรกคำว่า ‘แตกต่างกัน’ หรือ ‘ไม่ซ้ำกัน’ ในโจทย์เพื่อทดสอบว่าคุณจะเลือกใช้ DISTINCT หรือไม่
SELECT customer_id, COUNT(DISTINCT product_id) AS distinct_products
FROM orders
GROUP BY customer_id
HAVING COUNT(DISTINCT product_id) > 3;กรองด้วย SUM แทน COUNT
โครงสร้างเดียวกันนี้ใช้กับผลรวมได้เช่นกัน ‘ลูกค้าที่ใช้จ่ายรวมมากกว่า 1000’ จะจัดกลุ่มตามลูกค้าและกรองด้วย SUM(amount)
ค่ารวมใด ๆ ก็สามารถใช้เป็นเงื่อนไข HAVING ได้ ไม่ว่าจะเป็น COUNT, SUM, AVG, MAX หรือ MIN การสังเกตว่าคำถามต้องการวัดสิ่งใดจะบอกคุณว่าควรกรองด้วยค่ารวมใด
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000;เงื่อนไขหลายข้อในการจัดกลุ่ม
HAVING สามารถรวมเงื่อนไขด้วย AND/OR รวมถึงใช้ค่ารวมที่แตกต่างกันได้ ‘ลูกค้าที่มีคำสั่งซื้อมากกว่า 5 รายการ AND มีค่าเฉลี่ยต่อคำสั่งซื้อสูงกว่า 100’ สามารถเขียนเป็น HAVING ส่วนเดียวได้
แต่ละเงื่อนไขจะอ้างอิงค่ารวมของตัวเอง และทุกเงื่อนไขจะถูกประเมินผลหลังการจัดกลุ่ม นี่แสดงให้เห็นว่าคุณสามารถเขียนกฎทางธุรกิจที่ซับซ้อนได้อย่างเป็นระเบียบ
SELECT customer_id,
COUNT(*) AS orders,
AVG(amount) AS avg_order
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5 AND AVG(amount) > 100;ใช้ WHERE และ HAVING ร่วมกัน
บ่อยครั้งคุณต้องกรองแถวก่อนนับจำนวน ‘จากคำสั่งซื้อในปีนี้ ให้ค้นหาลูกค้าที่มีคำสั่งซื้อมากกว่า 5 รายการ’ จะใช้ WHERE สำหรับวันที่ และใช้ HAVING สำหรับจำนวน
WHERE จะลดจำนวนแถวก่อน จากนั้นจึงใช้การจัดกลุ่มและเกณฑ์ของ HAVING การใช้ทั้งสองส่วนคำสั่งได้ถูกต้องในคำสั่งสอบถามเดียวเป็นสัญญาณของทักษะระดับกลาง
SELECT customer_id, COUNT(*) AS orders_this_year
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING COUNT(*) > 5;การค้นหารายการซ้ำ
กรณีใกล้เคียงกันคือ ‘ค้นหาอีเมลที่ซ้ำกัน’ ให้จัดกลุ่มตามคอลัมน์ที่ควรไม่ซ้ำกัน แล้วเก็บเฉพาะกลุ่มที่มีจำนวนมากกว่าหนึ่ง
รูปแบบเดียวนี้ใช้ตรวจหารหัสที่ซ้ำ ธุรกรรมที่เกิดซ้ำ หรือค่าใด ๆ ที่ปรากฏมากกว่าจำนวนที่ควรจะเป็น ผู้สัมภาษณ์ใช้คำถามนี้เพื่อทดสอบว่าคุณมองเห็นการจัดกลุ่มเป็นเครื่องมือสำหรับกำจัดข้อมูลซ้ำหรือไม่
SELECT email, COUNT(*) AS times_seen
FROM users
GROUP BY email
HAVING COUNT(*) > 1;กลุ่มที่มีจำนวนตรงตามกำหนดพอดี
เกณฑ์ไม่ได้เป็น 'มากกว่า' เสมอไป 'ลูกค้าที่มีคำสั่งซื้อเพียงหนึ่งรายการพอดี' ใช้ HAVING COUNT(*) = 1 ส่วน 'อย่างน้อย 3 รายการ' ใช้ >= 3
ฟังคำที่ระบุขอบเขตในโจทย์: 'มากกว่า', 'อย่างน้อย', 'พอดี', 'น้อยกว่า' แต่ละคำสอดคล้องกับตัวดำเนินการเปรียบเทียบที่แตกต่างกัน และผู้สัมภาษณ์จะทดสอบความแม่นยำในจุดนี้
-- One-time customers
SELECT customer_id, COUNT(*) AS orders
FROM orders
GROUP BY customer_id
HAVING COUNT(*) = 1;แสดงเฉพาะคีย์
บางครั้งโจทย์ต้องการเพียงตัวระบุที่ผ่านเกณฑ์ ไม่ใช่จำนวน ซึ่งมักใช้เป็นข้อมูลป้อนให้คำสั่งอื่น คุณยังคงจัดกลุ่มและกรองข้อมูล แต่ใช้ SELECT เฉพาะคีย์
จากนั้นคุณอาจครอบสิ่งนี้ด้วยคำสั่งย่อย IN หรือใช้การเชื่อมตารางเพื่อดึงระเบียนทั้งหมดของลูกค้าเหล่านั้น การรู้จักการประกอบรูปแบบนี้เป็นจุดเด่นของผู้มีประสบการณ์ระดับอาวุโส
SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;แนวทางตอบคำถามสัมภาษณ์
สำหรับคำถามใด ๆ เกี่ยวกับ 'กลุ่มที่ผ่านเกณฑ์' ให้กล่าวอธิบายสี่ขั้นตอน: (1) ระบุคีย์สำหรับจัดกลุ่ม (2) เลือกค่าที่สรุปรวม (3) ตัดสินใจเลือกตัวดำเนินการเปรียบเทียบจากถ้อยคำ (4) ใส่ตัวกรองแถวไว้ใน WHERE และตัวกรองค่ารวมไว้ใน HAVING
แม่แบบนี้ใช้แก้ปัญหาทั้งกลุ่มที่เกี่ยวกับการนับและการกรองได้
ตรวจสอบความเข้าใจ
เลือกคำสั่งที่ถูกต้องสำหรับโจทย์
สรุปทบทวน
รูปแบบ: จัดกลุ่มตามคีย์ รวมค่า แล้วกรองกลุ่มด้วย HAVING รูปแบบนี้ใช้แก้โจทย์ 'คำสั่งซื้อมากกว่า N รายการ', 'ลูกค้าที่ใช้จ่ายมากที่สุด', รายการซ้ำ และลูกค้าที่สั่งซื้อเพียงครั้งเดียวได้
- ใช้
COUNT(*)สำหรับแถว และใช้COUNT(DISTINCT col)สำหรับค่าที่ไม่ซ้ำ - เลือกตัวดำเนินการเปรียบเทียบให้ตรงกับถ้อยคำในโจทย์
- ใส่ตัวกรองแถวไว้ใน WHERE และตัวกรองค่ารวมไว้ใน HAVING
- ใช้ SELECT เฉพาะคีย์เพื่อส่งต่อให้คำสั่งย่อย IN หรือการเชื่อมตาราง
คำถามที่พบบ่อย
บทเรียน “นับและกรองกลุ่ม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “นับและกรองกลุ่ม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “นับและกรองกลุ่ม”
ค้นหากลุ่มที่ผ่านเกณฑ์ ซึ่งเป็นโจทย์มาตรฐานเรื่องลูกค้าที่มีคำสั่งซื้อมากกว่า N รายการ คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “นับและกรองกลุ่ม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม
ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- กฎ GROUP BY สำหรับคอลัมน์ใน SELECT
- HAVING เทียบกับ WHERE
- จัดกลุ่มด้วยหลายคอลัมน์และนิพจน์
- นับและกรองกลุ่ม