335 votes

SELECT DISTINCT sur une colonne

À l'aide de SQL Server, j'ai...

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

Je veux

1   FOO-23	Orange
3   FOO-24	Apple

Cette requête n'est pas moi. Comment puis-je SÉLECTIONNER DISTINCTS sur une seule colonne?

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

390voto

Aaron Alton Points 9929

En supposant que vous êtes sur SQL Server 2005 ou plus, vous pouvez utiliser une expression de table commune avec la fonction 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

60voto

Jakob Egger Points 4282

La solution la plus simple serait d'utiliser une sous-requête pour trouver le code minimal correspondant à votre requête. Dans la sous-requête, vous utilisez GROUP BY au lieu de DISTINCT:

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

15voto

KM. Points 51800

essayez ceci:

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

MODIFIER
une fois que l'OP a corrigé sa samle de sortie (déjà eu UNE seule ligne de résultat, maintenant a montré), c'est la requête appropriée:

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

6voto

Anna Karthi Points 31

Essayez ceci:

Select * from [TestData]  Where ID in(Select Distinct Min(ID) from [TestData] Group By PRODUCT)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X