استخدام GROUP BY و HAVING في SQL لاكتشاف القيم المكررة في قواعد البيانات

4 دقيقة قراءة

استخدام GROUP BY و HAVING في SQL لاكتشاف القيم المكررة

تُعد السجلات المكررة واحدة من أكثر المشكلات شيوعًا في قواعد البيانات الواقعية. سواء كنت تعمل في مجالات مثل المالية أو الرعاية الصحية أو اللوجستيات أو التعليم أو تحليل البيانات أو منصات البرمجيات كخدمة، فإن أصحاب العمل يتوقعون من المطورين المبتدئين والمتوسطين القدرة على اكتشاف البيانات المكررة وتحليلها وتنظيفها بشكل احترافي.

هذه المهارة ليست مجرد معرفة بصيغة SQL، بل هي مهارة عملية مرتبطة مباشرة بدقة التقارير، ومنع الاحتيال، وموثوقية العمليات، وضمان جودة البيانات داخل الأنظمة الإنتاجية.

في مقابلات العمل، يتم اختبار المطورين غالبًا من خلال سيناريوهات واقعية مثل:

  • اكتشاف الفواتير المكررة
  • تكرار تسجيل المستخدمين
  • عمليات مالية متعددة في نفس اللحظة الزمنية
  • أخطاء في نقل البيانات بين الأنظمة
  • شذوذ في سجلات الأحداث
  • استيراد بيانات مكرر من مصادر خارجية

إن فهم كيفية استخدام GROUP BY و HAVING بشكل صحيح يمنحك القدرة على حل هذه المشكلات بكفاءة وإظهار فهم حقيقي لهندسة قواعد البيانات الخلفية.

لماذا يهتم أصحاب العمل باكتشاف التكرارات

يركز العديد من المطورين الجدد على بناء الميزات فقط، بينما يهتم مهندسو الخلفية الأقوياء بسلامة البيانات أولاً.

وجود بيانات مكررة قد يؤدي إلى خسائر كبيرة مثل:

  • لوحات تحليل غير دقيقة
  • مدفوعات مكررة
  • إرسال إشعارات أو رسائل مكررة
  • تلف بيانات المخزون
  • تقارير تدقيق مضللة
  • خلل في مزامنة الأنظمة

لذلك، فإن القدرة على تحديد السجلات المكررة وعزلها تعتبر مؤشرًا قويًا على التفكير التشغيلي وليس مجرد معرفة سطحية بالكود.

المفاهيم الأساسية في اكتشاف التكرار

1. GROUP BY

تقوم جملة GROUP BY بتجميع الصفوف التي تشترك في نفس القيم ضمن مجموعات واحدة.

مثال:

SELECT email
FROM users
GROUP BY email;

هذا الاستعلام يجمع جميع عناوين البريد الإلكتروني المتطابقة معًا.

2. COUNT()

تُستخدم الدالة COUNT لحساب عدد الصفوف داخل كل مجموعة.

SELECT email, COUNT(*)
FROM users
GROUP BY email;

هذا يعرض عدد مرات تكرار كل بريد إلكتروني داخل الجدول.

3. HAVING

تُستخدم جملة HAVING لتصفية النتائج بعد عملية التجميع.

SELECT email, COUNT(*)
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

هذا الاستعلام يُرجع فقط القيم المكررة.

النمط الأساسي لاكتشاف التكرارات

معظم عمليات اكتشاف التكرار تتبع هذا النمط الأساسي:

SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;

هذا النمط يُستخدم بشكل واسع في مقابلات العمل، وتنظيف قواعد البيانات، والتحقق من عمليات نقل البيانات، ومهام التدقيق التحليلي.

التكرار عبر عدة أعمدة

في الأنظمة الواقعية، نادرًا ما يتم الاعتماد على عمود واحد فقط لتحديد التكرار. غالبًا يتم استخدام أكثر من عمود معًا لتعريف السجل بشكل منطقي.

مثال:

SELECT first_name, last_name, birth_date, COUNT(*)
FROM customers
GROUP BY first_name, last_name, birth_date
HAVING COUNT(*) > 1;

هذا الاستعلام يكتشف العملاء الذين لديهم نفس الهوية الكاملة.

هذا النوع من التفكير مهم جدًا لأنه يعكس منطق الأعمال الحقيقي وليس مجرد مفاتيح تقنية بسيطة.

التعامل مع التكرارات الزمنية

التواريخ والأوقات تضيف تعقيدًا إضافيًا، لأن نفس الحدث قد يتم تسجيله بفروق زمنية صغيرة جدًا.

في كثير من الحالات، نحتاج إلى تجاهل أجزاء من الوقت والتركيز على جزء معين فقط.

اكتشاف التكرار في نفس الثانية

مثال:

SELECT user_id,
       DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') AS second_value,
       COUNT(*)
FROM logs
GROUP BY user_id, second_value
HAVING COUNT(*) > 1;

في PostgreSQL:

SELECT user_id,
       DATE_TRUNC('second', created_at) AS second_value,
       COUNT(*)
FROM logs
GROUP BY user_id, second_value
HAVING COUNT(*) > 1;

هذا النوع من المعالجة يعكس مهارة تحويل قواعد الأعمال إلى منطق بيانات فعلي.

التكرار عبر أوقات مختلفة

في بعض الأنظمة، نحتاج إلى معرفة ما إذا كان المستخدم يقوم بنفس الفعل في نفس الوقت بشكل متكرر عبر أيام مختلفة.

مثال:

SELECT user_id,
       TIME(created_at) AS repeated_time,
       COUNT(*)
FROM activity_logs
GROUP BY user_id, repeated_time
HAVING COUNT(*) > 1;

حالات الاستخدام

  • اكتشاف الاحتيال
  • تحليل سلوك الروبوتات
  • مراجعة العمليات المتكررة
  • التحقق من جدولة الأنظمة

أنماط الأعمال المتقدمة

1. المعاملات المكررة

SELECT customer_id,
       amount,
       transaction_date,
       COUNT(*)
FROM payments
GROUP BY customer_id, amount, transaction_date
HAVING COUNT(*) > 1;

2. الملفات المكررة

SELECT file_hash, COUNT(*)
FROM uploads
GROUP BY file_hash
HAVING COUNT(*) > 1;

3. سجلات الأحداث المكررة

SELECT event_type,
       TIME(created_at),
       COUNT(*)
FROM system_logs
GROUP BY event_type, TIME(created_at)
HAVING COUNT(*) > 1;

إرجاع الصفوف الكاملة

أحد الأخطاء الشائعة هو الاكتفاء بالقيم المجمعة دون استخراج الصفوف الكاملة للتحليل.

SELECT t.*
FROM users t
JOIN (
    SELECT email
    FROM users
    GROUP BY email
    HAVING COUNT(*) > 1
) duplicates
ON t.email = duplicates.email;

مشاريع عملية لتطوير المهارة

لجعل مهاراتك في SQL أكثر وضوحًا أمام أصحاب العمل، يمكنك بناء مشاريع عملية مثل:

  • لوحة تنظيف البيانات
  • نظام كشف الفواتير المكررة
  • أداة التحقق من تسجيل المستخدمين
  • محلل أنماط الاحتيال
  • نظام كشف شذوذ السجلات

تحسين الأداء

عند التعامل مع بيانات ضخمة، تصبح الاستعلامات المكلفة مشكلة حقيقية.

استخدام الفهارس

CREATE INDEX idx_email ON users(email);

تجنب الدوال على الأعمدة المفهرسة

WHERE DATE(created_at) = '2026-01-01'

بدلاً من ذلك:

WHERE created_at >= '2026-01-01 00:00:00'
AND created_at < '2026-01-02 00:00:00'

رؤية المهندس المحترف

المهندسون الكبار لا ينظرون إلى التكرار كمسألة SQL فقط، بل كعلامة على مشاكل أعمق في النظام.

مثل:

  • غياب القيود على قاعدة البيانات
  • مشاكل التزامن
  • أخطاء في معالجة الطوابير
  • ضعف إدارة المعاملات
  • مشاكل تكامل الأنظمة الخارجية

الخلاصة النهائية

تعلم اكتشاف التكرارات باستخدام GROUP BY و HAVING ليس مجرد حفظ لأوامر SQL، بل هو تدريب على التفكير مثل مهندس أنظمة حقيقي مسؤول عن جودة البيانات.

ابدأ بالاستعلامات البسيطة، ثم انتقل إلى:

  • قواعد متعددة الأعمدة
  • توحيد التواريخ والأوقات
  • التحليل عبر الأيام
  • تحسين الأداء
  • تحليل الصفوف الكاملة

هذه المهارة تجعل المطور قادرًا على التعامل مع بيانات الإنتاج المعقدة، وهو ما يبحث عنه أصحاب العمل في الواقع.

استشارة مجانية — رد خلال 24 ساعة

لنبنِ
شيئاً يستحق السوق

أكثر من 500 مشروع مُسلَّم. أكثر من 8 سنوات خبرة. أنظمة مؤسسية، ذكاء اصطناعي، وتطبيقات عالية الأداء.