복붙노트

[SQL] 하나 개의 컬럼에 대한 DISTINCT

SQL

하나 개의 컬럼에 대한 DISTINCT

하자 내가 다음 쿼리를 말한다.

SELECT ID, Email, ProductName, ProductModel FROM Products

어떻게하면 중복 이메일을 반환하지 않도록 수정할 수 있습니까?

여러 행이 동일한 이메일을 포함 할 때 즉, 나는 결과가 해당 행 (바람직 마지막) 중 하나만 포함 할. 다른 컬럼의 중복은 허용되어야한다.

DISTINCT와 GROUP BY와 같은 조항은 전체 행에 대한 작업에 나타납니다. 아니에요 확신이 접근하는 방법.

해결법

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

    1.당신은 SQL Server 2005 또는 위의 사용을 사용하는 경우이 :

    당신은 SQL Server 2005 또는 위의 사용을 사용하는 경우이 :

    SELECT *
      FROM (
                    SELECT  ID, 
                            Email, 
                            ProductName, 
                            ProductModel,
                            ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn
                        FROM Products
                  ) a
    WHERE rn = 1
    

    편집하다: 예 where 절 사용 a :

    SELECT *
      FROM (
                    SELECT  ID, 
                            Email, 
                            ProductName, 
                            ProductModel,
                            ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn
                        FROM Products
                       WHERE ProductModel = 2
                         AND ProductName LIKE 'CYBER%'
    
                  ) a
    WHERE rn = 1
    
  2. ==============================

    2.이는 SQL 서버 2005 +를 가정하고 "마지막으로"당신의 정의는 주어진 이메일 최대 PK입니다

    이는 SQL 서버 2005 +를 가정하고 "마지막으로"당신의 정의는 주어진 이메일 최대 PK입니다

    WITH CTE AS
    (
    SELECT ID, 
           Email, 
           ProductName, 
           ProductModel, 
           ROW_NUMBER() OVER (PARTITION BY Email ORDER BY ID DESC) AS RowNumber 
    FROM   Products
    )
    SELECT ID, 
           Email, 
           ProductName, 
           ProductModel
    FROM CTE 
    WHERE RowNumber = 1
    
  3. ==============================

    3.당신은 별개의 행, 열이 아닌로의 DISTINCT 생각을 사용하는 경우. 이 열은 정확히 같은 일치하지 않는 행만 반환됩니다.

    당신은 별개의 행, 열이 아닌로의 DISTINCT 생각을 사용하는 경우. 이 열은 정확히 같은 일치하지 않는 행만 반환됩니다.

    SELECT DISTINCT ID, Email, ProductName, ProductModel
    FROM Products
    
    ----------------------
    1 | something@something.com | ProductName1 | ProductModel1
    2 | something@something.com | ProductName1 | ProductModel1
    

    ID 열에이 다르기 때문에 쿼리는 두 행을 반환합니다. 당신은 나는 이런 식으로 뭔가를 추천 마지막을 반환 할 경우 ID 열이 증가하는 IDENTITY 열 것을 나는 믿고있어 :

    SELECT DISTINCT TOP 1 ID, Email, ProductName, ProductModel
    FROM Products
    ORDER BY ID DESC
    

    상위 1은 첫번째 마지막 행으로 결과를 반환합니다 하행 ID하여 주문하여, 첫 번째 레코드를 반환합니다. 이렇게하면 마지막 레코드를 제공 할 것입니다.

  4. ==============================

    4.당신은 이상 할 수있는 기능으로 그룹을 사용하여

    당신은 이상 할 수있는 기능으로 그룹을 사용하여

    SELECT ID, 이메일, 제품 이름, ProductModel 제품의 GROUP BY 이메일

  5. ==============================

    5.액세스의 경우, 여기에 SQL 선택 쿼리 I 선물을 사용할 수 있습니다 :

    액세스의 경우, 여기에 SQL 선택 쿼리 I 선물을 사용할 수 있습니다 :

    예를 들어, 당신은이 테이블을 가지고 :

    888 || T800 아놀드 || t800.arnold@cyberdyne.com

    (123) || 존 코너 || s.connor@skynet.com

    (125) || 사라 코너 ||s.connor@skynet.com

    그리고 당신은 별개의 메일을 선택해야합니다. 당신이 그것을 할 수 있습니다 :

    SQL SELECT :

    SELECT MAX(p.CLIENTE) AS ID_CLIENTE
    , (SELECT TOP 1 x.NOMBRES 
        FROM Rep_Pre_Ene_MUESTRA AS x 
        WHERE x.MAIL=p.MAIL 
         AND x.CLIENTE=(SELECT MAX(l.CLIENTE) FROM Rep_Pre_Ene_MUESTRA AS l WHERE x.MAIL=l.MAIL)) AS NOMBRE, 
    p.MAIL
    FROM Rep_Pre_Ene_MUESTRA AS p
    GROUP BY p.MAIL;
    

    당신은 최대의 ID를 선택하려면이 사용할 수 있습니다, 그 최대의 ID로 상대의 이름, 당신은 방법 것을 다른 속성을 추가 할 수 있습니다. 그리고 마지막에 당신은 마지막 별개의 열이 당신에게 유일한 그룹을 필터에 별개의 열을 넣어.

    이것은 당신에게 기자의 데이터로 최대 ID를 가져올 것이다, 당신은 분이나 다른 기능을 사용할 수 있으며 하위 쿼리에 해당 기능을 복제합니다.

    이 선택 의지 반환 :

    888 || T800 아놀드 || t800.arnold@cyberdyne.com

    (125) || 사라 코너 ||s.connor@skynet.com

    색인을 선택한 열을 기억하고 별개의 열은 모두 대문자 또는 소문자에없는 숫자 데이터가 있어야합니다, 그렇지 않으면 작동하지 않습니다. 이뿐만 아니라 하나의 등록 된 메일로 작동합니다. 코딩 해피!

  6. ==============================

    6.전체 행에 작업 BY DISTINCT와 GROUP 그 이유는이 쿼리 반환 전체 행입니다.

    전체 행에 작업 BY DISTINCT와 GROUP 그 이유는이 쿼리 반환 전체 행입니다.

    쿼리가 반환해야 어떤 손에 의해 작성 시도하고 당신은 비 중복 컬럼에 넣어 무엇을 모호 것을 볼 수 있습니다 : 수 있도록 당신은 이해합니다.

    말 그대로 다른 열에 무엇인지 상관하지 않는 경우이를 반환하지 않습니다. 각 전자 메일 주소를 임의의 행을 반환하는 나에게 약간의 쓸모없는 것 같다.

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

    7.이 시도

    이 시도

    ;With Tab AS (SELECT DISTINCT Email FROM  Products)
    SELECT Email,ROW_NUMBER() OVER(ORDER BY Email ASC) AS  Id FROM Tab
    ORDER BY Email ASC
    
  8. ==============================

    8.이 시도:

    이 시도:

    SELECT ID, Email, ProductName, ProductModel FROM Products WHERE ID IN (SELECT MAX(ID) FROM Products GROUP BY Email)
    
  9. from https://stackoverflow.com/questions/5021693/distinct-for-only-one-column by cc-by-sa and MIT license