كيف نحسب تكرار البريد الإلكتروني دون فقدان تفاصيل الصفوف؟

متوسطقراءة دقيقةآخر تحديث 3 أكتوبر 2026

SQL قواعد البيانات

الإجابة

يمكن استخدام COUNT(*) كدالة نافذة لحساب عدد الصفوف التي تشترك في قيمة معينة، مع الاحتفاظ بكل صف على حدة. نكتب OVER (PARTITION BY email) لتصبح النتيجة عدد العملاء الذين يحملون البريد الإلكتروني نفسه، وتظهر هذه القيمة بجانب كل عميل منهم.

تفيد هذه الطريقة عند مراجعة البيانات المكررة لأننا نحتاج عادة إلى المعرّفات والأسماء، وليس قائمة البريد وعدد مرات ظهوره فقط. وبعد حساب العدد داخل CTE، نستطيع اختيار الصفوف التي يزيد عدد مجموعتها على واحد لعرض جميع السجلات المرتبطة بالتكرار.

مثال

WITH customers AS (
  SELECT 1 AS id, 'a@example.com' AS email
  UNION ALL SELECT 2, 'a@example.com'
  UNION ALL SELECT 3, 'b@example.com'
)
SELECT id, email,
       COUNT(*) OVER (PARTITION BY email) AS copies
FROM customers
ORDER BY id;

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

باختصار: يحسب COUNT(*) OVER (PARTITION BY ...) حجم كل مجموعة مكررة مع إبقاء تفاصيل صفوفها متاحة.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

ما قيم copies حسب ترتيب id في نتيجة الكود التالي؟

CREATE TABLE customers (
  id INT PRIMARY KEY,
  email VARCHAR(100) NOT NULL
);
INSERT INTO customers (id, email) VALUES
(1, 'a@example.com'),
(2, 'a@example.com'),
(3, 'b@example.com');

SELECT id,
       COUNT(*) OVER (PARTITION BY email) AS copies
FROM customers
ORDER BY id;