sql - عدم - كيفية مقارنة البيانات الموجودة في عمودين للعثور على التكرارات في برنامج excel




كيفية حذف الصفوف المكررة في مزود خدمة؟ (9)

كيف يمكنني delete duplicate rows حيث لا يوجد unique row id ؟

طاولتي هي

col1  col2 col3 col4 col5 col6 col7
john  1    1    1    1    1    1 
john  1    1    1    1    1    1
sally 2    2    2    2    2    2
sally 2    2    2    2    2    2

أريد أن يتم ترك ما يلي بعد الإزالة المتكررة:

john  1    1    1    1    1    1
sally 2    2    2    2    2    2

لقد حاولت بعض الاستعلامات ولكن أعتقد أنها تعتمد على معرف الصف لأنني لا أحصل على النتيجة المرجوة. فمثلا:

DELETE FROM table WHERE col1 IN (
    SELECT id FROM table GROUP BY id HAVING ( COUNT(col1) > 1 )
)

أنا أحب CTEs و ROW_NUMBER مثل الجمع بين الاثنين تسمح لنا بمعرفة الصفوف التي يتم حذفها (أو تحديثها) ، لذلك فقط قم بتغيير DELETE FROM CTE... إلى SELECT * FROM CTE :

WITH CTE AS(
   SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7],
       RN = ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col1)
   FROM dbo.Table1
)
DELETE FROM CTE WHERE RN > 1

DEMO (النتيجة مختلفة ، أفترض أنه بسبب خطأ مطبعي من جانبك)

COL1    COL2    COL3    COL4    COL5    COL6    COL7
john    1        1       1       1       1       1
sally   2        2       2       2       2       2

يحدد هذا المثال التكرارات بواسطة عمود واحد col1 بسبب PARTITION BY col1 . إذا كنت تريد تضمين عدة أعمدة ، فأضفها ببساطة إلى PARTITION BY :

ROW_NUMBER()OVER(PARTITION BY Col1, Col2, ... ORDER BY OrderColumn)

إذا كان لديك القدرة على إضافة عمود إلى الجدول بشكل مؤقت ، فهذا كان الحل الذي عمل لي:

ALTER TABLE dbo.DUPPEDTABLE ADD RowID INT NOT NULL IDENTITY(1,1)

ثم قم بإجراء DELETE باستخدام مجموعة من MIN و GROUP BY

DELETE b
FROM dbo.DUPPEDTABLE b
WHERE b.RowID NOT IN (
                     SELECT MIN(RowID) AS RowID
                     FROM dbo.DUPPEDTABLE a WITH (NOLOCK)
                     GROUP BY a.ITEM_NUMBER,
                              a.CHARACTERISTIC,
                              a.INTVALUE,
                              a.FLOATVALUE,
                              a.STRINGVALUE
                 );

تحقق من أن DELETE يتم بشكل صحيح:

SELECT a.ITEM_NUMBER,
    a.CHARACTERISTIC,
    a.INTVALUE,
    a.FLOATVALUE,
    a.STRINGVALUE, COUNT(*)--MIN(RowID) AS RowID
FROM dbo.DUPPEDTABLE a WITH (NOLOCK)
GROUP BY a.ITEM_NUMBER,
    a.CHARACTERISTIC,
    a.INTVALUE,
    a.FLOATVALUE,
    a.STRINGVALUE
ORDER BY COUNT(*) DESC 

يجب ألا تحتوي النتيجة على صفوف ذات عدد أكبر من 1. أخيرًا ، قم بإزالة العمود المتصل:

ALTER TABLE dbo.DUPPEDTABLE DROP COLUMN RowID;

إذا لم يكن لديك مراجع ، مثل المفاتيح الخارجية ، يمكنك القيام بذلك. أفعل ذلك كثيرا عند اختبار البراهين للمفهوم ويتكرر بيانات الاختبار.

SELECT DISTINCT [col1] ، [col2] ، [col3] ، [col4] ، [col5] ، [col6] ، [col7]

INTO [newTable]

.

انتقل إلى مستكشف الكائن وحذف الجدول القديم.

إعادة تسمية الجدول الجديد باسم الجدول القديم.


بدون استخدام CTE و ROW_NUMBER() يمكنك فقط حذف السجلات فقط باستخدام المجموعة من خلال وظيفة MAX هنا والمثال

DELETE
FROM MyDuplicateTable
WHERE ID NOT IN
(
SELECT MAX(ID)
FROM MyDuplicateTable
GROUP BY DuplicateColumn1, DuplicateColumn2, DuplicateColumn3)

لدى Microsoft دليل ry vey ry في كيفية إزالة التكرارات. تحقق من http://support.microsoft.com/kb/139444

باختصار ، إليك أسهل طريقة لحذف العناصر المكررة عندما يكون لديك عدد قليل من الصفوف المطلوب حذفها:

SET rowcount 1;
DELETE FROM t1 WHERE myprimarykey=1;

myprimarykey هو معرف الصف.

قمت بتعيين rowcount إلى 1 لأن لدي صفين فقط تم نسخهما. إذا كان لدي 3 صفوف مكررة ، فقد قمت بضبط rowcount إلى 2 بحيث تحذف الأولين وسترى واحدة فقط في الجدول t1.

آمل أن يساعد أي شخص


هناك طريقة أخرى لإزالة الصفوف المعنونة دون فقد المعلومات في خطوة واحدة مثل ما يلي:

delete from dublicated_table t1 (nolock)
join (
    select t2.dublicated_field
    , min(len(t2.field_kept)) as min_field_kept
    from dublicated_table t2 (nolock)
    group by t2.dublicated_field having COUNT(*)>1
) t3 
on t1.dublicated_field=t3.dublicated_field 
    and len(t1.field_kept)=t3.min_field_kept

مع الإشارة إلى https://support.microsoft.com/en-us/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server

تتضمن فكرة إزالة النسخة المكررة

  • أ) حماية هذه الصفوف غير المكررة
  • ب) احتفظ بواحد من الصفوف العديدة المؤهلة معًا كمكررة.

خطوة بخطوة

  • 1) أولاً تحديد الصفوف التي تفي بتعريف مكررة وإدراجها في جدول مؤقت ، قل #tableAll.
  • 2) حدد غير مكررة (صفوف مفردة) أو صفوف مميزة في جدول مؤقت ، قل #tableUnique.
  • 3) حذف من الجدول المصدر للربط #table الكل لحذف التكرارات.
  • 4) إدراج في الجدول المصدر جميع الصفوف من #tableUnique.
  • 5) إسقاط #tableAll و # tableUnique

-- this query will keep only one instance of a duplicate record.
;WITH cte
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY col1, col2, col3-- based on what? --can be multiple columns
                                       ORDER BY ( SELECT 0)) RN
         FROM   Mytable)



delete  FROM cte
WHERE  RN > 1

with myCTE
as

(
select productName,ROW_NUMBER() over(PARTITION BY productName order by slno) as Duplicate from productDetails
)
Delete from myCTE where Duplicate>1




sql-delete