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

DISTINCT เทียบกับ GROUP BY เพื่อหาค่าที่ไม่ซ้ำกัน

กรณีที่ DISTINCT เป็นคำตอบที่ถูกต้อง และกรณีที่ผู้สัมภาษณ์คาดหวังให้ใช้ GROUP BY แทน

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

DISTINCT ทำอะไร

DISTINCT ลบแถวที่ซ้ำกันออก สิ่งสำคัญที่ผู้สัมภาษณ์มักตรวจสอบคือ DISTINCT ทำงานกับแถวที่เลือกทั้งหมด ไม่ใช่คอลัมน์เดียว ดังนั้น SELECT DISTINCT a, b จึงกำจัดคู่ (a, b) ที่ซ้ำกัน

SELECT DISTINCT department
FROM employees;

DISTINCT ครอบคลุมคอลัมน์ที่เลือกทั้งหมด

เมื่อมีหลายคอลัมน์ DISTINCT จะเก็บชุดค่าที่ไม่ซ้ำกันแต่ละชุดไว้ โดยมีหนึ่งแถวต่อคู่ (department, job_title) ที่แตกต่างกัน ไม่มีวิธีมาตรฐานสำหรับกำจัดข้อมูลซ้ำจากคอลัมน์เดียวเท่านั้น

SELECT DISTINCT department, job_title
FROM employees;

GROUP BY ทำอะไร

GROUP BY รวมแถวที่มีคีย์เดียวกันให้เหลือหนึ่งแถวต่อกลุ่ม การจัดกลุ่มด้วยคอลัมน์เพียงอย่างเดียวจะให้ผลลัพธ์เหมือนกับการใช้ DISTINCT กับคอลัมน์นั้น

SELECT department
FROM employees
GROUP BY department;
-- equivalent to:
SELECT DISTINCT department
FROM employees;

ความแตกต่างที่แท้จริง: การรวมผล

แล้วทั้งสองแบบแตกต่างกันเมื่อใด คำตอบคือเมื่อคุณต้องการ ฟังก์ชันรวม GROUP BY สามารถใช้ COUNT, SUM หรือ AVG ต่อกลุ่มได้ แต่ DISTINCT ทำไม่ได้ ต้องการแถวที่ไม่ซ้ำกันใช่หรือไม่ ให้ใช้ DISTINCT ต้องการค่าต่อกลุ่มใช่หรือไม่ ให้ใช้ GROUP BY

SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

DISTINCT ไม่สามารถนับแยกตามกลุ่มได้

คุณไม่สามารถเพิ่มการนับเข้าไปใน DISTINCT ได้ สำหรับคำถามว่า “มีพนักงานกี่คนในแต่ละแผนก” เครื่องมือที่ถูกต้องคือ GROUP BY ร่วมกับ COUNT(*) ไม่ใช่ SELECT DISTINCT

-- WRONG intent: this errors or returns one total row
-- SELECT DISTINCT department, COUNT(*) FROM employees;

-- RIGHT:
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

COUNT(DISTINCT) รวมแนวคิดทั้งสองเข้าด้วยกัน

การใช้ร่วมกันที่พบบ่อยคือ COUNT(DISTINCT col) ซึ่งนับค่าที่ไม่ซ้ำกันภายในแต่ละกลุ่ม ในกรณีนี้ DISTINCT อยู่ภายในฟังก์ชันรวม และตอบคำถามว่า “แต่ละแผนกมีชื่อตำแหน่งที่แตกต่างกันกี่ชื่อ”

SELECT department,
       COUNT(DISTINCT job_title) AS distinct_titles
FROM employees
GROUP BY department;

การนับค่าที่ไม่ซ้ำกันโดยรวม

หากไม่มี GROUP BY COUNT(DISTINCT col) จะนับค่าที่ไม่ซ้ำกันทั่วทั้งตาราง ซึ่งเป็นคำตอบที่ชัดเจนสำหรับคำถามว่า “เรามีแผนกที่แตกต่างกันทั้งหมดกี่แผนก”

SELECT COUNT(DISTINCT department) AS n_departments
FROM employees;

-- equivalently, count the deduped subquery
SELECT COUNT(*)
FROM (SELECT DISTINCT department FROM employees) d;

ประสิทธิภาพมักไม่แตกต่างกัน

DISTINCT หรือ GROUP BY แบบใดเร็วกว่า สำหรับการกำจัดข้อมูลซ้ำทั่วไป ทั้งสองแบบมัก เทียบเท่ากัน เพราะตัวเพิ่มประสิทธิภาพวางแผนการทำงานคล้ายกัน ให้เลือกตามเจตนา: ใช้ DISTINCT สำหรับแถวที่ไม่ซ้ำกัน และใช้ GROUP BY เมื่อต้องการรวมผล

DISTINCT กับ NULL

DISTINCT จัดการกับ NULL อย่างไร คำตอบคือถือว่า NULL ทั้งหมดเท่ากัน ดังนั้นแถวจำนวนมากที่มีค่า NULL จะถูกรวมเหลือหนึ่งแถว GROUP BY ก็ทำเช่นเดียวกัน โดย NULL จะอยู่ในกลุ่มเดียว

-- If manager_id has several NULLs, this returns one NULL row
SELECT DISTINCT manager_id
FROM employees;

Postgres DISTINCT ON (โบนัส)

โบนัส: Postgres มี DISTINCT ON (expr) ที่ไม่เป็นไปตามมาตรฐาน โดยเก็บแถวแรกของแต่ละคีย์ตาม ORDER BY โค้ดที่ใช้ข้ามฐานข้อมูลได้ควรใช้ ROW_NUMBER() แทน

-- Postgres only: latest order per customer
SELECT DISTINCT ON (customer_id) customer_id, order_id, order_date
FROM orders
ORDER BY customer_id, order_date DESC;

DISTINCT ใช้กับ SELECT ทั้งหมด ไม่ใช่คอลัมน์เดียว

ยังมีอีกจุดที่มักพลาด: DISTINCT ทำงานกับทั้งแถว ดังนั้น SELECT DISTINCT customer_id, order_date จะไม่ให้หนึ่งแถวต่อลูกค้าหนึ่งราย หากต้องการเช่นนั้น ให้ใช้ GROUP BY ร่วมกับ MAX หรือฟังก์ชันหน้าต่าง

-- Does NOT give one row per customer
SELECT DISTINCT customer_id, order_date FROM orders;

-- One row per customer: latest order date
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;

ตรวจสอบอย่างรวดเร็ว

เลือกเครื่องมือที่ถูกต้อง

สรุปทบทวน

สรุป: DISTINCT กำจัดแถวที่ซ้ำกันทั้งแถว ส่วน GROUP BY รวมแถวตามคีย์และเปิดให้ใช้ฟังก์ชันรวมได้ COUNT(DISTINCT col) นับค่าที่ไม่ซ้ำกัน ทั้งสองแบบถือว่า NULL ทั้งหมดเป็นค่าเดียวกัน และประสิทธิภาพมักไม่แตกต่างกัน

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

บทเรียน “DISTINCT เทียบกับ GROUP BY เพื่อหาค่าที่ไม่ซ้ำกัน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “DISTINCT เทียบกับ GROUP BY เพื่อหาค่าที่ไม่ซ้ำกัน”

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

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

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

บทเรียน “DISTINCT เทียบกับ GROUP BY เพื่อหาค่าที่ไม่ซ้ำกัน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การเลือกคอลัมน์และข้อผิดพลาดของนามแฝง
  2. คอลัมน์คำนวณและลำดับความสำคัญของนิพจน์
  3. DISTINCT เทียบกับ GROUP BY เพื่อหาค่าที่ไม่ซ้ำกัน
  4. นิพจน์ CASE ใน SELECT
← กลับไปที่ Coding Interview Prep