Menemukan nilai duplikat dalam sebuah tabel SQL

It's mudah untuk menemukan duplikat dengan satu bidang:

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

Jadi jika kita memiliki sebuah tabel

ID   NAME   EMAIL
1    John   asd@asd.com
2    Sam    asd@asd.com
3    Tom    asd@asd.com
4    Bob    bob@asd.com
5    Tom    asd@asd.com

Query ini akan memberikan kita John, Sam, Tom, Tom karena mereka semua sama-sama email.

Namun, apa yang saya inginkan adalah untuk mendapatkan duplikat dengan sama email dan nama.

Artinya, saya ingin mendapatkan "Tom", "Tom".

Alasan saya perlu ini: saya membuat kesalahan, dan diizinkan untuk menyisipkan duplikat nama dan email nilai-nilai. Sekarang saya perlu untuk menghapus/mengubah duplikat, jadi saya perlu menemukan mereka terlebih dahulu.

Mengomentari pertanyaan (2)
Larutan
SELECT
    name, email, COUNT(*)
FROM
    users
GROUP BY
    name, email
HAVING 
    COUNT(*) > 1

Hanya kelompok pada kedua kolom.

Catatan: yang lebih tua ANSI standar ini untuk memiliki semua non-agregat kolom dalam KELOMPOK DENGAN tetapi hal ini telah berubah dengan ide "ketergantungan fungsional":

Dalam database relasional teori, ketergantungan fungsional adalah kendala antara dua set atribut dalam suatu relasi dari database. Dengan kata lain, ketergantungan fungsional adalah kendala yang menggambarkan hubungan antara atribut-atribut dalam suatu relasi.

Dukungan tidak konsisten:

Komentar (10)

coba ini:

declare @YourTable table (id int, name varchar(10), email varchar(50))

INSERT @YourTable VALUES (1,'John','John-email')
INSERT @YourTable VALUES (2,'John','John-email')
INSERT @YourTable VALUES (3,'fred','John-email')
INSERT @YourTable VALUES (4,'fred','fred-email')
INSERT @YourTable VALUES (5,'sam','sam-email')
INSERT @YourTable VALUES (6,'sam','sam-email')

SELECT
    name,email, COUNT(*) AS CountOf
    FROM @YourTable
    GROUP BY name,email
    HAVING COUNT(*)>1

OUTPUT:

name       email       CountOf
---------- ----------- -----------
John       John-email  2
sam        sam-email   2

(2 row(s) affected)

jika anda ingin Id dups gunakan ini:

SELECT
    y.id,y.name,y.email
    FROM @YourTable y
        INNER JOIN (SELECT
                        name,email, COUNT(*) AS CountOf
                        FROM @YourTable
                        GROUP BY name,email
                        HAVING COUNT(*)>1
                    ) dt ON y.name=dt.name AND y.email=dt.email

OUTPUT:

id          name       email
----------- ---------- ------------
1           John       John-email
2           John       John-email
5           sam        sam-email
6           sam        sam-email

(4 row(s) affected)

untuk menghapus duplikat coba:

DELETE d
    FROM @YourTable d
        INNER JOIN (SELECT
                        y.id,y.name,y.email,ROW_NUMBER() OVER(PARTITION BY y.name,y.email ORDER BY y.name,y.email,y.id) AS RowRank
                        FROM @YourTable y
                            INNER JOIN (SELECT
                                            name,email, COUNT(*) AS CountOf
                                            FROM @YourTable
                                            GROUP BY name,email
                                            HAVING COUNT(*)>1
                                        ) dt ON y.name=dt.name AND y.email=dt.email
                   ) dt2 ON d.id=dt2.id
        WHERE dt2.RowRank!=1
SELECT * FROM @YourTable

OUTPUT:

id          name       email
----------- ---------- --------------
1           John       John-email
3           fred       John-email
4           fred       fred-email
5           sam        sam-email

(4 row(s) affected)
Komentar (0)

Coba ini:

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

Jika anda ingin menghapus duplikat, di sini's cara yang lebih sederhana untuk melakukan itu daripada harus menemukan genap/ganjil baris ke tiga sub-pilih:

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

Dan untuk menghapus:

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
)

Jauh lebih mudah untuk membaca dan memahami IMHO

Catatan: Satu-satunya masalah adalah bahwa anda harus mengeksekusi permintaan tersebut sampai tidak ada baris yang dihapus, karena anda hanya menghapus 1 dari masing-masing menduplikasi setiap waktu

Komentar (7)

Coba yang berikut ini:

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
Komentar (1)
 SELECT name, email 
    FROM users
    WHERE email in
    (SELECT email FROM users
    GROUP BY email 
    HAVING COUNT(*)>1)
Komentar (0)

Sedikit terlambat ke pesta tapi saya menemukan yang benar-benar keren pemecahan masalah untuk menemukan semua duplikat Id:

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

coba kode ini

WITH CTE AS

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

Ini memilih/menghapus semua duplikat catatan kecuali satu record dari masing-masing kelompok duplikat. Jadi, menghapus daun semua catatan unik + satu record dari masing-masing kelompok duplikat.

Pilih duplikat:

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

Menghapus duplikat:

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

Diketahui jumlah yang lebih besar dari catatan, hal ini dapat menyebabkan masalah kinerja.

Komentar (4)

Dalam kasus anda bekerja dengan Oracle, dengan cara ini akan lebih baik:

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

insert into my_users values (1, 'John', 'asd@asd.com');
insert into my_users values (2, 'Sam', 'asd@asd.com');
insert into my_users values (3, 'Tom', 'asd@asd.com');
insert into my_users values (4, 'Bob', 'bob@asd.com');
insert into my_users values (5, 'Tom', 'asd@asd.com');

commit;

select *
  from my_users
 where rowid not in (select min(rowid) from my_users group by name, email);
Komentar (0)
select name, email
, case 
when ROW_NUMBER () over (partition by name, email order by name) > 1 then 'Yes'
else 'No'
end "duplicated ?"
from users
Komentar (3)

Jika anda ingin melihat apakah ada duplikat dalam tabel anda, saya menggunakan Query di bawah ini:

create table my_table(id int, name varchar(100), email varchar(100));

insert into my_table values (1, 'shekh', 'shekh@rms.com');
insert into my_table values (1, 'shekh', 'shekh@rms.com');
insert into my_table values (2, 'Aman', 'aman@rms.com');
insert into my_table values (3, 'Tom', 'tom@rms.com');
insert into my_table values (4, 'Raj', 'raj@rms.com');

Select COUNT(1) As Total_Rows from my_table 
Select Count(1) As Distinct_Rows from ( Select Distinct * from my_table) abc 
Komentar (0)

Ini adalah hal yang mudah yang saya've datang dengan. Menggunakan ekspresi meja yang umum (CTE) dan partisi jendela (saya pikir fitur ini di SQL 2008 dan kemudian).

Contoh ini menemukan semua mahasiswa dengan nama duplikat dan dob. Bidang yang anda ingin memeriksa duplikasi pergi di ATAS klausa. Anda dapat mencakup bidang-bidang lain yang anda inginkan dalam proyeksi.

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
Komentar (0)
select id,name,COUNT(*) from India group by Id,Name having COUNT(*)>1
Komentar (0)

Dengan Menggunakan CTE juga kita dapat menemukan nilai duplikat seperti ini

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
Komentar (0)

Bagaimana kita bisa menghitung digandakan nilai-nilai?? entah itu berulang 2 kali atau lebih besar dari 2. hitung saja, bukan kelompok yang bijaksana.

sesederhana

select COUNT(distinct col_01) from Table_01
Komentar (1)
 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
/
Komentar (0)

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

Saya pikir ini akan bekerja dengan baik untuk pencarian berulang-nilai dalam kolom tertentu.

Komentar (2)

Ini juga harus bekerja, mungkin memberikan ini mencoba.

  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)

Terutama baik dalam kasus anda Jika anda mencari duplikat yang memiliki beberapa jenis awalan atau umum perubahan, seperti misalnya domain baru di mail. kemudian anda dapat menggunakan replace() pada kolom ini

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