하나의 열에서 SELECT DISTINCT
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
이 검색어는 저를 찾지 못했습니다. 하나의 열에서 DISTINCT를 어떻게 선택할 수 있습니까?
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
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'
다음은 기본적으로 몇 가지 다른 답변과 동일한 버전이지만 일부 인라인 값으로 인해 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 * 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
'IT story' 카테고리의 다른 글
"테이블을 다시 작성해야하는 변경 내용 저장 방지"부정적인 영향 (0) | 2020.04.07 |
---|---|
파이썬을 사용하여 직접 실행 가능한 크로스 플랫폼 GUI 앱을 어떻게 만들 수 있습니까? (0) | 2020.04.07 |
HTTP 1.0 대 1.1 (0) | 2020.04.07 |
CUDA 런타임 API를 사용하여 오류를 확인하는 정식 방법은 무엇입니까? (0) | 2020.04.07 |
TypeError를 수정하는 방법 : 해시하기 전에 유니 코드 개체를 인코딩해야합니까? (0) | 2020.04.07 |