복붙노트

[SQL] T-SQL : 모든 중복 행을 삭제하지만 하나를 유지 [중복]

SQL

T-SQL : 모든 중복 행을 삭제하지만 하나를 유지 [중복]

나는 행의 매우 많은 양의 테이블을 가지고있다. 중복은 허용하지만 행이 내가이 테이블에서 일부 중복이 알고 생성 된 방법에 문제로 인해되지 않습니다. 나는 키 컬럼의 관점에서 여분의 행을 제거해야합니다. 일부 다른 열이 약간 다른 데이터가있을 수 있습니다하지만 난 그것에 대해 걱정하지 않는다. 나는 아직도 그러나 이러한 행 중 하나를 유지해야합니다. 이 모든 열에서 작동하기 때문에 DISTINCT 의지하지 작업을 선택하고 나는 키 열을 기반으로 억제 중복 할 필요가있다.

어떻게 여분의 행을 삭제할 수 있지만 여전히 효율적으로 일을 계속?

해결법

  1. ==============================

    1.당신은 당신이 사용했던 버전을 언급하지 않았지만, SQL 2005 이상, 당신은 OVER 절 공통 테이블 식을 사용할 수 있습니다. 그것은이 같은 작은 뭔가를 간다 :

    당신은 당신이 사용했던 버전을 언급하지 않았지만, SQL 2005 이상, 당신은 OVER 절 공통 테이블 식을 사용할 수 있습니다. 그것은이 같은 작은 뭔가를 간다 :

    WITH cte AS (
      SELECT[foo], [bar], 
         row_number() OVER(PARTITION BY foo, bar ORDER BY baz) AS [rn]
      FROM TABLE
    )
    DELETE cte WHERE [rn] > 1
    

    그것으로 주위를 재생하고 무엇을 얻을 참조하십시오.

    (편집 : 도움이 될하기위한 시도에서, 누군가가 CTE 내에서 ORDER BY 절을 편집 명확하게하기 위해, 당신은 여기에 원하는 무엇이든으로 주문할 수는 CTE에 의해 반환 된 열 중 하나 일 필요는 없다 사실,.. 일반적인 사용의 경우는 여기에 "foo는, 바", "바즈"그룹 식별자는 타임 스탬프의 일종입니다. 최신을 유지하기 위해, 당신은 ORDER BY 바즈 내림차순 할 것)

  2. ==============================

    2.예 쿼리 :

    예 쿼리 :

    DELETE FROM Table
    WHERE ID NOT IN
    (
    SELECT MIN(ID)
    FROM Table
    GROUP BY Field1, Field2, Field3, ...
    )
    

    다음 필드는 그룹에 중복 행을하고자하는 열이다.

  3. ==============================

    3.여기에 내 트위스트는 실행 가능한 예제,입니다. 이드 고유 곳은 상황에서 작동합니다, 당신은 다른 열에서 중복 값이 ​​있습니다.

    여기에 내 트위스트는 실행 가능한 예제,입니다. 이드 고유 곳은 상황에서 작동합니다, 당신은 다른 열에서 중복 값이 ​​있습니다.

    DECLARE @SampleData AS TABLE (Id int, Duplicate varchar(20))
    
    INSERT INTO @SampleData
    SELECT 1, 'ABC' UNION ALL
    SELECT 2, 'ABC' UNION ALL
    SELECT 3, 'LMN' UNION ALL
    SELECT 4, 'XYZ' UNION ALL
    SELECT 5, 'XYZ'
    
    DELETE FROM @SampleData WHERE Id IN (
        SELECT Id FROM (
            SELECT 
                Id
                ,ROW_NUMBER() OVER (PARTITION BY [Duplicate] ORDER BY Id) AS [ItemNumber]
                -- Change the partition columns to include the ones that make the row distinct
            FROM 
                @SampleData
        ) a WHERE ItemNumber > 1 -- Keep only the first unique item
    )
    
    SELECT * FROM @SampleData
    

    그리고 결과 :

    Id          Duplicate
    ----------- ---------
    1           ABC
    3           LMN
    4           XYZ
    

    확실하지 왜 먼저 무슨 생각이의 ... 확실히 갈 수있는 가장 간단한 방법 만 작동합니다.

  4. from https://stackoverflow.com/questions/6025367/t-sql-deleting-all-duplicate-rows-but-keeping-one by cc-by-sa and MIT license