Coding Interview Prep · บทเรียน

จัดกลุ่มด้วยหลายคอลัมน์และนิพจน์

คีย์จัดกลุ่มแบบประกอบและการจัดกลุ่มตามค่าที่คำนวณแล้ว

บทเรียน 3 จาก 413 ขั้นตอน

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

มากกว่าคีย์การจัดกลุ่มเพียงคีย์เดียว

รายงานจริงแทบไม่เคยจัดกลุ่มด้วยคอลัมน์เดียว ผู้สัมภาษณ์มักเพิ่มระดับจาก ‘ยอดขายตามภูมิภาค’ เป็น ‘ยอดขายตามภูมิภาคต่อเดือน’ เพื่อดูว่าคุณเข้าใจ คีย์การจัดกลุ่มแบบผสม หรือไม่

กฎนี้ขยายใช้ได้ตรงไปตรงมา: การระบุคอลัมน์เพิ่มใน GROUP BY จะสร้างหนึ่งแถวต่อ ชุดผสมที่แตกต่างกัน ของคอลัมน์เหล่านั้น

ความหมายของหลายคอลัมน์

เมื่อเขียน GROUP BY region, product คีย์ของกลุ่มคือคู่ (ภูมิภาค, สินค้า) แต่ละคู่ที่ไม่ซ้ำกันจะกลายเป็นหนึ่งแถวในผลลัพธ์

  • ภูมิภาค 5 แห่งและสินค้า 4 รายการจะให้ได้มากที่สุด 20 กลุ่ม
  • ชุดผสมที่ไม่เคยเกิดขึ้นจะไม่สร้างแถวขึ้นมาเลย
  • ลำดับคอลัมน์ใน GROUP BY ไม่เปลี่ยนชุดผลลัพธ์ แต่อาจเปลี่ยนแผนการประมวลผลได้ในบางกรณี
SELECT region, product, SUM(amount) AS total
FROM sales
GROUP BY region, product;

ยังคงต้องปฏิบัติตามกฎของ SELECT

ข้อจำกัดหลักยังคงเดิม คอลัมน์ทุกคอลัมน์ใน SELECT ที่ไม่ได้รวมค่าต้องปรากฏอยู่ใน GROUP BY เมื่อใช้คีย์แบบผสม คุณเพียงระบุคอลัมน์เหล่านั้นทั้งหมด

การลืมคอลัมน์หนึ่งคอลัมน์ในกลุ่มที่มีหลายคีย์เป็นข้อผิดพลาดที่พบบ่อยที่สุดเมื่ออยู่ภายใต้ความกดดันในการสัมภาษณ์ จับคู่รายการใน GROUP BY กับคอลัมน์ใน SELECT ที่ไม่ได้รวมค่าให้ตรงกันทุกคอลัมน์

-- Both region and product appear in GROUP BY
SELECT region, product,
       COUNT(*) AS orders,
       AVG(amount) AS avg_amount
FROM sales
GROUP BY region, product;

การจัดกลุ่มด้วยนิพจน์

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

นิพจน์ใน GROUP BY ต้องตรงกับนิพจน์ใน SELECT กลไกฐานข้อมูลจะจัดกลุ่มตามผลลัพธ์ที่คำนวณได้

SELECT DATE_TRUNC('month', order_date) AS month,
       SUM(amount) AS monthly_total
FROM sales
GROUP BY DATE_TRUNC('month', order_date);

การจัดกลุ่มด้วยกลุ่มย่อยจาก CASE

รูปแบบที่ทรงพลังคือการจัดกลุ่มด้วยนิพจน์ CASE เพื่อสร้างกลุ่มย่อยที่กำหนดเอง วิธีนี้ใช้สร้างสรุป ‘คำสั่งซื้อขนาดเล็ก / ขนาดกลาง / ขนาดใหญ่’ ได้โดยไม่ต้องมีตารางค้นหา

ผู้สัมภาษณ์ชอบคำถามนี้เพราะเป็นการทดสอบทั้งตรรกะของ CASE และการจัดกลุ่มด้วยค่าที่ได้จากการคำนวณในครั้งเดียว

SELECT CASE
         WHEN amount < 50  THEN 'small'
         WHEN amount < 200 THEN 'medium'
         ELSE 'large'
       END AS bucket,
       COUNT(*) AS orders
FROM sales
GROUP BY CASE
         WHEN amount < 50  THEN 'small'
         WHEN amount < 200 THEN 'medium'
         ELSE 'large'
       END;

การจัดกลุ่มด้วยตำแหน่งคอลัมน์

ระบบฐานข้อมูลหลายแบบอนุญาตให้จัดกลุ่มด้วยตำแหน่งลำดับ: GROUP BY 1, 2 หมายถึงคอลัมน์ SELECT ลำดับที่หนึ่งและสอง วิธีนี้กระชับแต่เปราะบาง

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

-- 1 = month expression, 2 = region
SELECT DATE_TRUNC('month', order_date) AS month,
       region, SUM(amount)
FROM sales
GROUP BY 1, 2;

NULL สร้างกลุ่มของตัวเอง

กับดักเรื่องการจัดการ NULL ภายในการจัดกลุ่มคือ เมื่อคอลัมน์ที่ใช้จัดกลุ่มมีค่า NULL แถวที่เป็น NULL ทั้งหมดจะถูกรวมเป็นกลุ่มเดียว

เรื่องนี้แตกต่างจากการเปรียบเทียบความเท่ากัน ซึ่ง NULL ไม่เท่ากับ NULL ในการจัดกลุ่ม NULL จะถูกถือว่า ‘เหมือนกัน’ และสร้างกลุ่มย่อยเดียว ผู้สัมภาษณ์ชอบความขัดแย้งที่ดูเหมือนจะเกิดขึ้นนี้

-- Rows with region IS NULL all land in one group
SELECT region, COUNT(*) AS orders
FROM sales
GROUP BY region;

GROUPING SETS สำหรับหลายระดับ

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

นี่เป็นสัญญาณของประสบการณ์ระดับกลางถึงอาวุโส: แทนที่จะใช้คำสั่งสอบถามสามชุดแล้วรวมด้วย UNION คำสั่งเดียวก็สามารถคืนยอดรวมตามภูมิภาค ตามสินค้า และยอดรวมทั้งหมดพร้อมกันได้

SELECT region, product, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS ((region), (product), ());

ROLLUP และ CUBE

ROLLUP และ CUBE เป็นรูปแบบย่อสำหรับชุดการจัดกลุ่มที่ใช้บ่อย ROLLUP(region, product) ให้ผลลัพธ์เป็นภูมิภาค+สินค้า ยอดรวมย่อยตามภูมิภาค และยอดรวมทั้งหมด เหมาะสำหรับรายงานแบบลำดับชั้น

CUBE จะสร้างชุดผสมทุกแบบของคอลัมน์ที่ระบุ การรู้จักสิ่งเหล่านี้ช่วยแยกผู้สมัครที่เคยสร้างคำสั่งสอบถามสำหรับรายงานจริงออกจากผู้สมัครทั่วไป

SELECT region, product, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP (region, product);

ตัวอย่าง: รายงานภูมิภาครายเดือน

นำแนวคิดต่าง ๆ มารวมกัน: คำนวณยอดขายรวมและค่าเฉลี่ยตามภูมิภาคต่อเดือน เฉพาะคำสั่งซื้อที่เสร็จสมบูรณ์ และเรียงลำดับเพื่อให้อ่านง่าย

WHERE จะจำกัดแถวก่อน คีย์แบบผสมจะจัดกลุ่มตามภูมิภาคและนิพจน์เดือน ส่วน ORDER BY จะจัดเรียงผลลัพธ์ นี่เป็นคำตอบแบบครบถ้วนที่มักใช้ในการสัมภาษณ์นักวิเคราะห์

SELECT region,
       DATE_TRUNC('month', order_date) AS month,
       SUM(amount) AS total,
       AVG(amount) AS avg_order
FROM sales
WHERE status = 'completed'
GROUP BY region, DATE_TRUNC('month', order_date)
ORDER BY region, month;

วิธีอธิบายเหตุผลออกมาเป็นคำพูด

สำหรับคำถามเกี่ยวกับการจัดกลุ่มแบบผสม ให้ระบุคีย์อย่างชัดเจน: ‘ฉันกำลังจัดกลุ่มตามชุดผสมของ X และ Y ดังนั้นฉันจะได้หนึ่งแถวต่อคู่ (X, Y) ที่แตกต่างกัน’

จากนั้นยืนยันว่าคอลัมน์ทุกคอลัมน์ใน SELECT ที่ไม่ได้รวมค่าอยู่ในคีย์ดังกล่าว และกล่าวถึงการที่ NULL ทั้งหมดถูกรวมเป็นกลุ่มเดียว การอธิบายอย่างเป็นระบบเช่นนี้คือสิ่งที่การสัมภาษณ์ระดับกลางให้ความสำคัญ

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ใช้เหตุผลเกี่ยวกับคีย์การจัดกลุ่มแบบผสม

สรุปทบทวน

คีย์แบบผสม: การระบุหลายคอลัมน์จะสร้างหนึ่งแถวต่อชุดผสมที่แตกต่างกัน และคอลัมน์ทุกคอลัมน์ใน SELECT ที่ไม่ได้รวมค่าต้องอยู่ในคีย์นั้น

  • คุณสามารถจัดกลุ่มด้วยนิพจน์ กลุ่มย่อยจาก CASE หรือตำแหน่งลำดับได้ แต่ตำแหน่งลำดับเปราะบาง
  • ค่า NULL ในคอลัมน์ที่ใช้จัดกลุ่มจะถูกรวมเป็นกลุ่มเดียว
  • GROUPING SETS, ROLLUP และ CUBE สร้างระดับการจัดกลุ่มหลายระดับในคำสั่งสอบถามเดียว
  • เลื่อนตัวกรองแถวไปไว้ใน WHERE ก่อนการจัดกลุ่ม
เริ่มต้นได้ฟรี

เรียนรู้ Coding Interview Prep ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
90
บทเรียน
360

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

บทเรียน “จัดกลุ่มด้วยหลายคอลัมน์และนิพจน์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “จัดกลุ่มด้วยหลายคอลัมน์และนิพจน์”

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

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

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

บทเรียน “จัดกลุ่มด้วยหลายคอลัมน์และนิพจน์” ใช้เวลานานแค่ไหน

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

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

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

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

  1. กฎ GROUP BY สำหรับคอลัมน์ใน SELECT
  2. HAVING เทียบกับ WHERE
  3. จัดกลุ่มด้วยหลายคอลัมน์และนิพจน์
  4. นับและกรองกลุ่ม
← กลับไปที่ Coding Interview Prep