วิธีหาแถวซ้ำใน SQL และกำหนดนิยามข้อมูลซ้ำโดย Michael Nocito
เรียนรู้วิธีตรวจสอบแถวข้อมูลซ้ำใน SQL ด้วยคำสั่ง COUNT และ GROUP BY จากบทความของ Michael Nocito ที่ใช้ตารางข้อมูลจำลอง 14 แถว

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- เปรียบเทียบ COUNT(*) และ COUNT(DISTINCT) เพื่อตรวจเช็คความผิดปกติก่อนเขียนโค้ด
- นิยามของคำว่าข้อมูลซ้ำขึ้นอยู่กับการเลือกคอลัมน์ที่จะนำมาจัดกลุ่มด้วย GROUP BY
- ใช้คำสั่ง HAVING เพื่อกรองดูเฉพาะกลุ่มที่มีจำนวนแถวมากกว่าหนึ่งแถวขึ้นไป
- ใช้ฟังก์ชัน ROW_NUMBER ช่วยทำเครื่องหมายแถวที่ต้องเก็บไว้แทนการลบทิ้งทันที
บทความนี้เขียนโดย Michael Nocito ผู้เชี่ยวชาญด้านข้อมูล โดยใช้เวลาศึกษาประมาณ 20 นาทีเพื่อทำความเข้าใจวิธีการตรวจสอบแถวข้อมูลซ้ำในตารางฐานข้อมูล ค้นหาสำเนาทุกชุด และตัดสินใจว่าจะเก็บแถวใดไว้โดยใช้ชุดคำสั่ง SQL ที่เข้าใจง่าย ขั้นตอนสำคัญก่อนเริ่มเขียนคำสั่งใดๆ คือการกำหนดนิยามให้ชัดเจนว่าอะไรคือข้อมูลซ้ำสำหรับตารางนั้นๆ เนื่องจากแถวข้อมูลอาจตรงกันทุกคอลัมน์หรือตรงกันแค่บางคอลัมน์ ซึ่งถือเป็นปัญหาที่แตกต่างกันและต้องใช้วิธีแก้ที่ต่างกัน
ขั้นตอนแรกที่ควรทำเสมอก่อนทำงานกับตารางชุดใหม่คือการรันคำสั่งเปรียบเทียบระหว่าง COUNT(*) กับ COUNT(DISTINCT key) หากตัวเลขทั้งสองค่าไม่ตรงกัน แสดงว่าตารางนั้นมีข้อมูลซ้ำซ้อนซ่อนอยู่ ข้อมูลตัวอย่างที่ใช้อธิบายในบทความนี้มาจากตาราง customers ที่มีทั้งหมด 14 แถว และจงใจใส่ข้อมูลซ้ำไว้ 3 แถว เพื่อให้สามารถตรวจสอบผลลัพธ์ด้วยตาเปล่าและยืนยันความถูกต้องได้ทันทีใน SQLite

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ความท้าทายแรกก่อนที่จะเริ่มตามล่าหาข้อมูลซ้ำคือการวิเคราะห์ว่าตัวตนของข้อมูลซ้ำคืออะไร เช่น ลูกค้าหมายเลข 103 ปรากฏตัว 3 ครั้งโดยมีทุกคอลัมน์เหมือนกันทั้งหมด ในขณะที่ลูกค้าหมายเลข 105 ปรากฏตัว 2 ครั้งแต่มีเมืองที่แตกต่างกัน หรือกรณีของ Ben Ortiz ที่มีอีเมลปรากฏภายใต้รหัส ID ที่ต่างกัน คำถามเหล่านี้ไม่มีคำตอบตายตัว เพราะคำว่าข้อมูลซ้ำไม่ใช่คุณสมบัติที่มีมาในตัวของข้อมูล แต่เป็นการตัดสินใจของผู้ใช้งานว่าต้องใช้คอลัมน์ใดบ้างที่ต้องตรงกันจึงจะถือว่าเป็นข้อมูลเดียวกัน
การเข้าใจความแตกต่างระหว่างคีย์ธรรมชาติและคอลัมน์ทั้งหมดถือเป็นหัวใจสำคัญในการจัดการฐานข้อมูล การเลือกใช้ GROUP BY ผิดคอลัมน์อาจทำให้ข้อมูลที่ควรถูกรวมกลายเป็นถูกมองข้าม หรือทำให้ข้อมูลที่ถูกต้องถูกลบออกโดยไม่ตั้งใจ การรันการตรวจสอบด้วย COUNT (DISTINCT) ก่อนทำ Join จึงเป็นแนวปฏิบัติที่ดีเยี่ยมของ Data Analyst ทุกคนเพื่อป้องกันไม่ให้ยอดสรุปผลลัพธ์ปลายทางผิดพลาดแบบเงียบๆ
"Duplicate is not a property of the data. It is a decision you make about which columns have to match before two rows mean the same thing."
Michael Nocito
หากต้องการตรวจสอบว่ามีรหัส ID ใดปรากฏซ้ำหรือไม่ สามารถใช้คำสั่ง SELECT COUNT(*) AS total_rows, COUNT(DISTINCT customer_id) AS distinct_ids FROM customers ซึ่งจะได้ผลลัพธ์เป็น 14 แถวและ 11 รหัสที่ไม่ซ้ำกัน ทำให้ทราบทันทีว่ามีส่วนต่างอยู่ 3 แถว ขั้นตอนต่อมาคือการใช้ GROUP BY ร่วมกับคอลัมน์ที่ต้องการ และคัดกรองเฉพาะกลุ่มที่มีจำนวนสำเนามากกว่า 1 ด้วยคำสั่ง HAVING เพื่อระบุว่าข้อมูลส่วนเกินนั้นเป็นของลูกค้ารายใดบ้าง
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น