duplicates - एक SQL तालिका में डुप्लिकेट मान ढूँढना




(20)

एक फ़ील्ड के साथ duplicates ढूंढना आसान है:

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

तो अगर हमारे पास एक टेबल है

ID   NAME   EMAIL
1    John   [email protected]
2    Sam    [email protected]
3    Tom    [email protected]
4    Bob    [email protected]
5    Tom    [email protected]

यह प्रश्न हमें जॉन, सैम, टॉम, टॉम देगा क्योंकि उनके पास एक ही email

हालांकि, मैं वही email और name साथ डुप्लिकेट प्राप्त करना चाहता हूं।

यही है, मैं "टॉम", "टॉम" प्राप्त करना चाहता हूं।

कारण मुझे इसकी आवश्यकता है: मैंने गलती की, और डुप्लिकेट name और email मान डालने की अनुमति दी। अब मुझे डुप्लिकेट को हटाने / बदलने की जरूरत है, इसलिए मुझे उन्हें पहले ढूंढना होगा।


Answers

निम्नलिखित आज़माएं:

SELECT * FROM
(
    SELECT Id, Name, Age, Comments, Row_Number() OVER(PARTITION BY Name, Age ORDER By Name)
        AS Rank 
        FROM Customers
) AS B WHERE Rank>1

हम डुप्लिकेट मानों को कैसे गिन सकते हैं ?? या तो इसे 2 गुना या 2 से अधिक बार दोहराया जाता है। बस उन्हें समझें, समूह के अनुसार नहीं।

की तरह सरल

select COUNT(distinct col_01) from Table_01

यह एक आसान बात है जिसके साथ मैं आया हूं। यह एक सामान्य टेबल अभिव्यक्ति (सीटीई) और एक विभाजन विंडो का उपयोग करता है (मुझे लगता है कि ये सुविधाएं SQL 2008 और बाद में हैं)।

यह उदाहरण डुप्लिकेट नाम और डॉब वाले सभी छात्रों को पाता है। जिन क्षेत्रों को आप डुप्लिकेशंस के लिए जांचना चाहते हैं, वे पूरे खंड में जाते हैं। आप प्रक्षेपण में इच्छित किसी भी अन्य फ़ील्ड को शामिल कर सकते हैं।

with cte (StudentId, Fname, LName, DOB, RowCnt)
as (
SELECT StudentId, FirstName, LastName, DateOfBirth as DOB, SUM(1) OVER (Partition By FirstName, LastName, DateOfBirth) as RowCnt
FROM tblStudent
)
SELECT * from CTE where RowCnt > 1
ORDER BY DOB, LName

SELECT * FROM users u where rowid = (select max(rowid) from users u1 where
u.email=u1.email);

सीटीई का उपयोग करके हम भी इस तरह डुप्लिकेट मूल्य पा सकते हैं

with MyCTE
as
(
select Name,EmailId,ROW_NUMBER() over(PARTITION BY EmailId order by id) as Duplicate from [Employees]

)
select * from MyCTE where Duplicate>1

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


इसे इस्तेमाल करे:

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

यह भी काम करना चाहिए, शायद इसे आज़माएं।

  Select * from Users a
            where EXISTS (Select * from Users b 
                where (     a.name = b.name 
                        OR  a.email = b.email)
                     and a.ID != b.id)

विशेष रूप से आपके मामले में अच्छा यदि आप डुप्लिकेट की खोज करते हैं जिनके पास कुछ प्रकार का उपसर्ग या सामान्य परिवर्तन है जैसे कि मेल में नया डोमेन। तो आप इन कॉलम पर प्रतिस्थापन () का उपयोग कर सकते हैं


यदि आप ओरेकल के साथ काम करते हैं, तो इस तरह से बेहतर होगा:

create table my_users(id number, name varchar2(100), email varchar2(100));

insert into my_users values (1, 'John', '[email protected]');
insert into my_users values (2, 'Sam', '[email protected]');
insert into my_users values (3, 'Tom', '[email protected]');
insert into my_users values (4, 'Bob', '[email protected]');
insert into my_users values (5, 'Tom', '[email protected]');

commit;

select *
  from my_users
 where rowid not in (select min(rowid) from my_users group by name, email);

select name, email
, case 
when ROW_NUMBER () over (partition by name, email order by name) > 1 then 'Yes'
else 'No'
end "duplicated ?"
from users

पार्टी के लिए थोड़ा देर हो चुकी है लेकिन मुझे सभी डुप्लिकेट आईडी खोजने के लिए वास्तव में एक अच्छा कामकाज मिला है:

SELECT GROUP_CONCAT( id )
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )

यह डुप्लिकेट के प्रत्येक समूह से एक रिकॉर्ड को छोड़कर सभी डुप्लिकेट रिकॉर्ड का चयन / हटा देता है। तो, हटाएं सभी अद्वितीय रिकॉर्ड + डुप्लीकेट के प्रत्येक समूह से एक रिकॉर्ड छोड़ देता है।

डुप्लीकेट का चयन करें:

SELECT *
FROM table
WHERE
    id NOT IN (
        SELECT MIN(id)
        FROM table
        GROUP BY column1, column2
);

डुप्लीकेट हटाएं:

DELETE FROM table
WHERE
    id NOT IN (
        SELECT MIN(id)
        FROM table
        GROUP BY column1, column2
);

बड़ी मात्रा में रिकॉर्ड्स से अवगत रहें, इससे प्रदर्शन की समस्याएं हो सकती हैं।


इस कोड को आजमाएं

WITH CTE AS

( SELECT Id, Name, Age, Comments, RN = ROW_NUMBER()OVER(PARTITION BY Name,Age ORDER BY ccn)
FROM ccnmaster )
select * from CTE 

यदि आप डुप्लिकेट डेटा (एक या कई मानदंडों से) ढूंढना चाहते हैं और वास्तविक पंक्तियों का चयन करना चाहते हैं।

with MYCTE as (
    SELECT DuplicateKey1
        ,DuplicateKey2 --optional
        ,count(*) X
    FROM MyTable
    group by DuplicateKey1, DuplicateKey2
    having count(*) > 1
) 
SELECT E.*
FROM MyTable E
JOIN MYCTE cte
ON E.DuplicateKey1=cte.DuplicateKey1
    AND E.DuplicateKey2=cte.DuplicateKey2
ORDER BY E.DuplicateKey1, E.DuplicateKey2, CreatedAt

http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/


 SELECT name, email 
    FROM users
    WHERE email in
    (SELECT email FROM users
    GROUP BY email 
    HAVING COUNT(*)>1)

यदि आप डुप्लीकेट को हटाना चाहते हैं, तो यहां तक ​​कि एक ट्रिपल उप-चयन में / विषम पंक्तियों को ढूंढने के बजाय इसे करने का एक आसान तरीका यहां दिया गया है:

SELECT id, name, email 
FROM users u, users u2
WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id

और इसलिए हटाने के लिए:

DELETE FROM users
WHERE id IN (
    SELECT id/*, name, email*/
    FROM users u, users u2
    WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id
)

IMHO को पढ़ने और समझने के लिए और अधिक आसान है

नोट: एकमात्र मुद्दा यह है कि जब तक कोई पंक्तियां हटाई नहीं जाती हैं तब तक आपको अनुरोध निष्पादित करना होगा, क्योंकि आप प्रत्येक बार प्रत्येक डुप्लिकेट में से केवल 1 को हटाते हैं


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

बस दोनों कॉलम पर समूह।

नोट: एएनएसआई मानक ग्रुप बाय में सभी गैर समेकित कॉलम रखना है। MySQL आपको इससे बचने की अनुमति देता है, लेकिन परिणाम अप्रत्याशित हैं:

MySQL में आपको sql_mode=only_full_group_by आवश्यकता है


 select emp.ename, emp.empno, dept.loc 
          from emp
 inner join dept 
          on dept.deptno=emp.deptno
 inner join
    (select ename, count(*) from
    emp
    group by ename, deptno
    having count(*) > 1)
 t on emp.ename=t.ename order by emp.ename
/

SELECT id, COUNT(id) FROM table1 GROUP BY id HAVING COUNT(id)>1;

मुझे लगता है कि यह किसी विशेष कॉलम में दोहराए गए मानों को खोजने के लिए ठीक से काम करेगा।


आप [INFORMATION_SCHEMA].[COLUMNS] खोजने के लिए [INFORMATION_SCHEMA].[COLUMNS] तालिका का उपयोग कर सकते हैं

Select * From [INFORMATION_SCHEMA].[COLUMNS] Where COLUMN_NAME like '%Column%'

दिए गए एसक्यूएल कथन के लिए टेबल और कॉलम जानकारी प्राप्त करने के लिए http://www.w3hattrick.com/2016/05/getting-table-and-column-information.html पर http://www.w3hattrick.com/2016/05/getting-table-and-column-information.html





sql duplicates