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
تتضمن فكرة إزالة النسخة المكررة
- أ) حماية هذه الصفوف غير المكررة
- ب) احتفظ بواحد من الصفوف العديدة المؤهلة معًا كمكررة.
خطوة بخطوة
- 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