복붙노트

[SQL] SQL에 의해 고유의 레코드를 선택하는 방법

SQL

SQL에 의해 고유의 레코드를 선택하는 방법

나는 "테이블에서 * 선택"을 수행 할 때 나는 다음과 같은 결과를 얻었다 :

1 item1 data1
2 item1 data2
3 item2 data3
4 item3 data4

당신이 볼 수 있듯이, 2 열에서 DUP 기록 (항목 1은 dupped있다)가있다. 어떻게 난 그냥이 같은 결과를 얻을 수 있습니다 :

1 item1 data1
2 item2 data3
3 item3 data4

하나의 레코드 고유 레코드의 나머지와 함께 중복에서 반환됩니다.

해결법

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

    1.단일 및 다중 열 이름을 가진 별개의 키워드로, 당신은 별개의 기록을 얻을 :

    단일 및 다중 열 이름을 가진 별개의 키워드로, 당신은 별개의 기록을 얻을 :

    SELECT DISTINCT column 1, column 2, ...
    FROM table_name;
    
  2. ==============================

    2.당신은 단지 중복을 제거해야하는 경우 DISTINCT 사용합니다. GROUP BY는 각 그룹에 집계 연산자를 적용하는 데 사용되어야한다

    당신은 단지 중복을 제거해야하는 경우 DISTINCT 사용합니다. GROUP BY는 각 그룹에 집계 연산자를 적용하는 데 사용되어야한다

    GROUP BY는 DISTINCT v에

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

    3.그것은 당신이 각각의 고유 한 항목에 대한 반환 할 rown에 따라 달라집니다. 귀하의 데이터는 SQL Server에 대한이 경우에 따라서 최소의 데이터 값을 나타낼 것으로 보인다.

    그것은 당신이 각각의 고유 한 항목에 대한 반환 할 rown에 따라 달라집니다. 귀하의 데이터는 SQL Server에 대한이 경우에 따라서 최소의 데이터 값을 나타낼 것으로 보인다.

    SELECT item, min(data)
    FROM  table
    GROUP BY item
    
  4. ==============================

    4.단지 그룹 여러 열 작동하지 않습니다에 의해 어느 집계 함수에 포함되지 말하던 때문에 내부 조인 사용합니다.

    단지 그룹 여러 열 작동하지 않습니다에 의해 어느 집계 함수에 포함되지 말하던 때문에 내부 조인 사용합니다.

    SELECT a.*
    FROM yourtable a
    INNER JOIN 
      (SELECT yourcolumn,
        MIN(id) as id
      FROM yourtable 
      GROUP BY yourcolumn
    ) AS b
      ON a.yourcolumn= b.yourcolumn
      AND a.id = b.id;
    
  5. ==============================

    5.당신이 사용할 수있는 4 가지 방법이 있습니다 :

    당신이 사용할 수있는 4 가지 방법이 있습니다 :

    테스트 데이터와 다음 샘플 표를 고려 ​​:

    /** Create test table */
    CREATE TEMPORARY TABLE dupes(word text, num int, id int);
    
    /** Add test data with duplicates */
    INSERT INTO dupes(word, num, id)
    VALUES ('aaa', 100, 1)
          ,('bbb', 200, 2)
          ,('ccc', 300, 3)
          ,('bbb', 400, 4)
          ,('bbb', 200, 5)     -- duplicate
          ,('ccc', 300, 6)     -- duplicate
          ,('ddd', 400, 7)
          ,('bbb', 400, 8)     -- duplicate
          ,('aaa', 100, 9)     -- duplicate
          ,('ccc', 300, 10);   -- duplicate
    

    이것은 가장 간단하고 정직하고, 또한 가장 제한적인 방법입니다 :

    SELECT DISTINCT word, num 
    FROM    dupes
    ORDER BY word, num;
    
    /*
    word|num|
    ----|---|
    aaa |100|
    bbb |200|
    bbb |400|
    ccc |300|
    ddd |400|
    */
    

    그룹화하면, 최소 (ID), 최대 (ID)와 같은 집계 데이터를 추가 계산 할 수 있습니다 (*) 등 :

    SELECT  word, num, min(id), max(id), count(*)
    FROM    dupes
    GROUP BY word, num
    ORDER BY word, num;
    
    /*
    word|num|min|max|count|
    ----|---|---|---|-----|
    aaa |100|  1|  9|    2|
    bbb |200|  2|  5|    2|
    bbb |400|  4|  8|    2|
    ccc |300|  3| 10|    3|
    ddd |400|  7|  7|    1|
    */
    

    하위 쿼리를 사용하여, 먼저 무시하도록 중복 행을 식별 할 수있는 다음 NOT IN (하위 쿼리) 구조와 외부 쿼리에서 그들을 필터링 :

    /** Find the higher id values of duplicates, distinct only added for clarity */
        SELECT  distinct d2.id
        FROM    dupes d1
            INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
        WHERE d2.id > d1.id
    
    /*
    id|
    --|
     5|
     6|
     8|
     9|
    10|
    */
    
    /** Use the previous query in a subquery to exclude the dupliates with higher id values */
    SELECT  *
    FROM    dupes
    WHERE   id NOT IN (
        SELECT  d2.id
        FROM    dupes d1
            INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
        WHERE d2.id > d1.id
    )
    ORDER BY word, num;
    
    /*
    word|num|id|
    ----|---|--|
    aaa |100| 1|
    bbb |200| 2|
    bbb |400| 4|
    ccc |300| 3|
    ddd |400| 7|
    */
    

    공통 테이블 식 (CTE)에서 원하는 위해 그룹 열로 분할하고 주문 ROW_NUMBER ()를 선택한다. 그런 다음 ROW_NUMBER을 (1) =에만 레코드를 선택 :

    WITH CTE AS (
        SELECT  *
               ,row_number() OVER(PARTITION BY word, num ORDER BY id) AS row_num
        FROM    dupes
    )
    SELECT  word, num, id 
    FROM    cte
    WHERE   row_num = 1
    ORDER BY word, num;
    
    /*
    word|num|id|
    ----|---|--|
    aaa |100| 1|
    bbb |200| 2|
    bbb |400| 4|
    ccc |300| 3|
    ddd |400| 7|
    */
    
  6. ==============================

    6.나는 어떤 이유로 DISTINCT 사용할 수없는 경우, 다음 GROUP BY가 작동합니다 찾을 수 있습니다.

    나는 어떤 이유로 DISTINCT 사용할 수없는 경우, 다음 GROUP BY가 작동합니다 찾을 수 있습니다.

  7. ==============================

    7.당신의 결과에 모든 열을 얻으려면 당신은 같은 장소 뭔가가 필요합니다

    당신의 결과에 모든 열을 얻으려면 당신은 같은 장소 뭔가가 필요합니다

    SELECT distinct a, Table.* FROM Table
    

    그것은 첫 번째 열로 배치됩니다 나머지는 모두 당신의 정의와 같은 순서로 열이 될 것입니다. 이것은 열 a는 반복 될 것입니다.

  8. ==============================

    8.선택 Eff_st ...에서 ( EFF_ST, ROW_NUMBER () 이상 (eff_st BY 파티션)을 선택 XYZ                          - ABC.CODE_DIM에서

    선택 Eff_st ...에서 ( EFF_ST, ROW_NUMBER () 이상 (eff_st BY 파티션)을 선택 XYZ                          - ABC.CODE_DIM에서

    ) 여기서 XYZ = 1 EFF_ST 의해 주문 제 5 행만을 가져

  9. from https://stackoverflow.com/questions/1641718/how-to-select-unique-records-by-sql by cc-by-sa and MIT license