duplicates 데이터 - SQL 테이블에서 중복 값 찾기




중복값 하나만 (21)

이 시도:

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

하나의 필드로 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]

이 쿼리는 John, Sam, Tom, Tom 모두에게 동일한 email 이 있기 때문에 제공됩니다.

그러나, 내가 원하는 것은 동일한 emailname 중복 된 것을 얻는 것입니다.

즉, 저는 "Tom", "Tom"을 얻고 싶습니다.

내가 이것을 필요로하는 이유 : 나는 실수를했고 중복되는 nameemail 값을 삽입하는 것을 허용했다. 이제 사본을 제거 / 변경 해야하므로 먼저 사본을 찾아야 합니다.


이것은 또한 작동해야합니다, 어쩌면 그것을 시도하십시오.

  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)

당신의 경우에 특히 좋다 어떤 종류의 접두어 나 일반적인 변경 사항 (예 : 메일의 새로운 도메인)이있는 중복을 검색하는 경우. 그런 다음이 열에서 replace ()를 사용할 수 있습니다.


테이블에 중복 레코드를 얻는 방법

SELECT COUNT (코드), 직원 코드 WHERE 상태 = 1 GROUP BY 코드 COUNT (코드)> 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
/

이렇게하면 각 중복 그룹에서 하나의 레코드를 제외한 모든 중복 레코드를 선택 / 삭제합니다. 따라서 삭제는 모든 고유 레코드 + 중복 된 각 그룹의 레코드 하나를 남겨 둡니다.

중복 항목 선택 :

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
);

더 많은 양의 레코드를 인식하면 성능 문제가 발생할 수 있습니다.


SELECT
  FirstName, LastName, MobileNo, COUNT(1) as CNT 
FROM        
  CUSTOMER
GROUP BY
  FirstName, LastName, MobileNo 
HAVING
  COUNT(1) > 1;

중복 된 값을 어떻게 계산할 수 있습니까 ?? 그것은 2 번 또는 2 번 반복됩니다. 단지 그들을 카운트하고, 현명한 그룹은 아닙니다.

간단하게

select COUNT(distinct col_01) from Table_01

하나 또는 여러 기준으로 중복 데이터를 찾고 실제 행을 선택하려는 경우

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/


아래와 같이 집계 함수로 작업하는 것을 사용할 수 있습니다.

create table #TableB (id_account int, data int, [date] date)
insert into #TableB values (1 ,-50, '10/20/2018'),
(1, 20, '10/09/2018'),
(2 ,-900, '10/01/2018'),
(1 ,20, '09/25/2018'),
(1 ,-100, '08/01/2018')  

SELECT id_account , data, COUNT(*)
FROM #TableB
GROUP BY id_account , data
HAVING COUNT(id_account) > 1

drop table #TableB

여기에 두 개의 필드로 id_account 및 데이터가 Count (*)와 함께 사용됩니다. 따라서 두 열에 동일한 값이 두 번 이상있는 모든 레코드를 제공합니다.

우리는 실수로 SQL 서버 테이블에 제약 조건을 추가하지 않고 프런트 엔드 응용 프로그램이있는 모든 열에 레코드가 중복 삽입되었습니다. 그런 다음 아래 쿼리를 사용하여 테이블에서 중복 쿼리를 삭제할 수 있습니다.

SELECT DISTINCT * INTO #TemNewTable FROM #OriginalTable
TRUNCATE TABLE #OriginalTable
INSERT INTO #OriginalTable SELECT * FROM #TemNewTable
DROP TABLE #TemNewTable

여기서 우리는 orignal 테이블의 모든 별개 레코드를 가져 와서 원래 테이블의 레코드를 삭제했습니다. 다시 새 테이블의 모든 고유 값을 원래 테이블에 삽입 한 다음 새 테이블을 삭제했습니다.


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 id, COUNT(id) FROM table1 GROUP BY id HAVING COUNT(id)>1;

나는 이것이 특정 열의 반복 된 값을 검색하는 데 제대로 작동 할 것이라고 생각한다.


테이블에 중복 행이 있는지 확인하려면 아래 쿼리를 사용합니다.

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

insert into my_table values (1, 'shekh', '[email protected]');
insert into my_table values (1, 'shekh', '[email protected]');
insert into my_table values (2, 'Aman', '[email protected]');
insert into my_table values (3, 'Tom', '[email protected]');
insert into my_table values (4, 'Raj', '[email protected]');


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

다음을 시도하십시오.

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

이것은 내가 생각해내는 쉬운 일입니다. 공통 테이블 식 (CTE)과 파티션 창을 사용합니다 (SQL Server 2008 이상에서 이러한 기능이 있다고 생각합니다).

이 예제는 중복 된 이름과 dob를 가진 모든 학생을 찾습니다. 중복을 확인하려는 필드는 OVER 절에 있습니다. 프로젝션에 원하는 다른 필드를 포함 할 수 있습니다.

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

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

두 열 모두를 그룹으로 묶기 만하면됩니다.

참고 : 이전 ANSI 표준은 GROUP BY에 모든 집계되지 않은 열을 포함하지만 "기능적 종속성" 이라는 개념으로 변경되었습니다.

관계형 데이터베이스 이론에서 함수 적 종속성은 데이터베이스의 관계에있는 두 세트의 속성 사이의 제약입니다. 즉, 함수 종속성은 관계에있는 속성 간의 관계를 설명하는 제약 조건입니다.

지원이 일관되지 않습니다.

  • 최근의 PostgreSQL 은 그것을 지원합니다 .
  • SQL Server (SQL Server 2017에서와 같이)는 여전히 GROUP BY의 모든 집계되지 않은 열을 필요로합니다.
  • MySQL은 예측할 수 없으며 sql_mode=only_full_group_by 가 필요합니다.
  • 오라클은 충분히 주류가 아닙니다 (경고 : 유머, 나는 오라클에 대해 모른다).

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


이 코드를 시험해 보라.

WITH CTE AS

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

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

오라클과 협력 할 경우 다음과 같은 방법이 바람직합니다.

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);

참고 : 이 대답은 SQL Server 2005에 대한 것입니다. SQL Server 2008 이상에서는 다른 대답에서 볼 수있는 훨씬 좋은 방법이 있습니다.

SELECT UNION ALL과 함께 INSERT를 사용할 수 있습니다.

INSERT INTO MyTable  (FirstCol, SecondCol)
    SELECT  'First' ,1
    UNION ALL
SELECT  'Second' ,2
    UNION ALL
SELECT  'Third' ,3
...

작은 데이터 세트에 대해서만, 귀하의 4 레코드에 대해 잘해야합니다.







sql duplicates