복붙노트

[SQL] 하나 개의 컬럼에 DISTINCT SELECT

SQL

하나 개의 컬럼에 DISTINCT SELECT

SQL 서버를 사용하여, 나는이 ...

ID  SKU     PRODUCT
=======================
1   FOO-23  Orange
2   BAR-23  Orange
3   FOO-24  Apple
4   FOO-25  Orange

내가 원하는

1   FOO-23  Orange
3   FOO-24  Apple

이 쿼리가 나를 점점되지 않습니다. 어떻게 하나 개의 컬럼에 DISTINCT 선택할 수 있습니까?

SELECT 
[ID],[SKU],[PRODUCT]
FROM [TestData] 
WHERE ([PRODUCT] = 
(SELECT DISTINCT [PRODUCT] FROM [TestData] WHERE ([SKU] LIKE 'FOO-%')) 
ORDER BY [ID]

해결법

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

    1.당신은 SQL Server 2005의 이상에 걸 가정하면, 당신은 ROW_NUMBER ()와 CTE를 사용할 수 있습니다 :

    당신은 SQL Server 2005의 이상에 걸 가정하면, 당신은 ROW_NUMBER ()와 CTE를 사용할 수 있습니다 :

    SELECT  *
    FROM    (SELECT ID, SKU, Product,
                    ROW_NUMBER() OVER (PARTITION BY PRODUCT ORDER BY ID) AS RowNumber
             FROM   MyTable
             WHERE  SKU LIKE 'FOO%') AS a
    WHERE   a.RowNumber = 1
    
  2. ==============================

    2.가장 간단한 해결책은 일치하는 검색어 최소 ID를 찾기위한 하위 쿼리를 사용하는 것입니다. 서브 쿼리에서 대신 DISTINCT의 BY GROUP을 사용 :

    가장 간단한 해결책은 일치하는 검색어 최소 ID를 찾기위한 하위 쿼리를 사용하는 것입니다. 서브 쿼리에서 대신 DISTINCT의 BY GROUP을 사용 :

    SELECT * FROM [TestData] WHERE [ID] IN (
       SELECT MIN([ID]) FROM [TestData]
       WHERE [SKU] LIKE 'FOO-%'
       GROUP BY [PRODUCT]
    )
    
  3. ==============================

    3.이 시도:

    이 시도:

    SELECT 
        t.*
        FROM TestData t
            INNER JOIN (SELECT
                            MIN(ID) as MinID
                            FROM TestData
                            WHERE SKU LIKE 'FOO-%'
                       ) dt ON t.ID=dt.MinID
    

    편집하다 영업 이익은 (이제 모든 보여 주었다 이전에 하나 개의 결과 만 행을했다) 자신의 samle 출력을 수정하면이 올바른 쿼리입니다 :

    declare @TestData table (ID int, sku char(6), product varchar(15))
    insert into @TestData values (1 ,  'FOO-23'      ,'Orange')
    insert into @TestData values (2 ,  'BAR-23'      ,'Orange')
    insert into @TestData values (3 ,  'FOO-24'      ,'Apple')
    insert into @TestData values (4 ,  'FOO-25'      ,'Orange')
    
    --basically the same as @Aaron Alton's answer:
    SELECT
        dt.ID, dt.SKU, dt.Product
        FROM (SELECT
                  ID, SKU, Product, ROW_NUMBER() OVER (PARTITION BY PRODUCT ORDER BY ID) AS RowID
                  FROM @TestData
                  WHERE  SKU LIKE 'FOO-%'
             ) AS dt
        WHERE dt.RowID=1
        ORDER BY dt.ID
    
  4. ==============================

    4.나는 그것이 육년 전 이상 질문을 받았다 알고 있지만 지식은 여전히 ​​지식이다. 내가 SQL 서버 2000에서 실행했다 이것은 무엇보다도 다른 솔루션입니다 :

    나는 그것이 육년 전 이상 질문을 받았다 알고 있지만 지식은 여전히 ​​지식이다. 내가 SQL 서버 2000에서 실행했다 이것은 무엇보다도 다른 솔루션입니다 :

    DECLARE @TestData TABLE([ID] int, [SKU] char(6), [Product] varchar(15))
    INSERT INTO @TestData values (1 ,'FOO-23', 'Orange')
    INSERT INTO @TestData values (2 ,'BAR-23', 'Orange')
    INSERT INTO @TestData values (3 ,'FOO-24', 'Apple')
    INSERT INTO @TestData values (4 ,'FOO-25', 'Orange')
    
    SELECT DISTINCT  [ID] = ( SELECT TOP 1 [ID]  FROM @TestData Y WHERE Y.[Product] = X.[Product])
                    ,[SKU]= ( SELECT TOP 1 [SKU] FROM @TestData Y WHERE Y.[Product] = X.[Product])
                    ,[PRODUCT] 
                FROM @TestData X  
    
  5. ==============================

    5.

    SELECT min (id) AS 'ID', min(sku) AS 'SKU', Product
        FROM TestData
        WHERE sku LIKE 'FOO%' -- If you want only the sku that matchs with FOO%
        GROUP BY product 
        ORDER BY 'ID'
    
  6. ==============================

    6.여기에 일부 인라인 값 덕분에 다른 답변의 몇 가지로 기본적으로 동일한 버전은,하지만 당신은 테스트, (그리고 원치 않는 테이블을 생성하지 않고)로 SQL 서버 관리 스튜디오에 붙여 복사 할 수있다.

    여기에 일부 인라인 값 덕분에 다른 답변의 몇 가지로 기본적으로 동일한 버전은,하지만 당신은 테스트, (그리고 원치 않는 테이블을 생성하지 않고)로 SQL 서버 관리 스튜디오에 붙여 복사 할 수있다.

    WITH [TestData]([ID],[SKU],[PRODUCT]) AS
    (
        SELECT *
        FROM (
            VALUES
            (1,   'FOO-23',  'Orange'),
            (2,   'BAR-23',  'Orange'),
            (3,   'FOO-24',  'Apple'),
            (4,   'FOO-25',  'Orange')
        )
        AS [TestData]([ID],[SKU],[PRODUCT])
    )
    
    SELECT * FROM [TestData] WHERE [ID] IN 
    (
        SELECT MIN([ID]) 
        FROM [TestData] 
        GROUP BY [PRODUCT]
    )
    

    결과

    ID  SKU     PRODUCT
    1   FOO-23  Orange
    3   FOO-24  Apple
    

    나는 다음을 무시했다 ...

    WHERE ([SKU] LIKE 'FOO-%')
    

    저자 결함 코드와 질문의 일부의 유일한 부분으로. 그것은 이곳을 찾는 사람들에게 도움이 될 가능성이 있습니다.

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

    7.이 시도:

    이 시도:

    SELECT * FROM [TestData 사용] WHERE ID를 (구별 MIN (ID를 선택) [TestData 사용] GROUP BY 제품)

  8. from https://stackoverflow.com/questions/966176/select-distinct-on-one-column by cc-by-sa and MIT license