sort not from conditions sql sql-server tsql distinct

not - where in sql



SELECT DISTINCT en una columna (6)

Usando SQL Server, tengo ...

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

quiero

1 FOO-23 Orange 3 FOO-24 Apple

Esta consulta no me está llevando allí. ¿Cómo puedo SELECCIONAR DISTINTO en una sola columna?

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


La solución más sencilla sería utilizar una subconsulta para encontrar el ID mínimo que coincida con su consulta. En la subconsulta usted usa GROUP BY lugar de DISTINCT :

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


Prueba esto:

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


Sé que se solicitó hace más de 6 años, pero el conocimiento sigue siendo conocimiento. Esta es una solución diferente a todas las anteriores, ya que tuve que ejecutarla bajo 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


Suponiendo que está en SQL Server 2005 o superior, puede usar un CTE con ROW_NUMBER ():

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


prueba esto:

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

EDITAR
una vez que el OP corrigió su salida de samle (anteriormente solo tenía UNA fila de resultados, ahora se muestra todo), esta es la consulta correcta:

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


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