source

한 열에서 구별 선택

gigabyte 2023. 4. 19. 23:08
반응형

한 열에서 구별 선택

SQL Server를 사용하여 다음을 수행합니다.

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

이 질문으로는 거기까지 갈 수 없어요.하나의 열에서만 구별을 선택하려면 어떻게 해야 합니까?

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

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

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

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

이것을 시험해 보세요.

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

편집
OP가 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

6년 전에 물어봤다는 건 알지만, 지식은 여전히 지식이에요.이것은 SQL Server 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  

이 버전은 기본적으로 다른 몇 가지 답변과 동일하지만 일부 인라인 값을 사용하여 SQL Server Management Studio에 붙여넣기를 복사하여 테스트하고 불필요한 테이블을 생성하지 않고 테스트할 수 있습니다.

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-%')

그것은 작성자의 코드 결함의 일부일 뿐 질문의 일부가 아니다.여기 있는 사람들에게 도움이 될 것 같지 않아요.

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'

이것을 시험해 보세요.

SELECT * FROM [TestData] WHERE Id IN(SELECT DISTINCT MIN(Id) FROM [TestData] GROUP BY Product)   

언급URL : https://stackoverflow.com/questions/966176/select-distinct-on-one-column

반응형