SQL Exclure les lignes précédemment sélectionnées dans une autre catégorie

SELECT * FROM dbo.Sample ORDER BY Site 

Sortie:

 Site Data 1 Cat 1 Mule 1 Pig 2 Giraffe 2 Dog 2 Horse 2 Mule 4 Cat 8 Dog 8 Pig 8 Mule 8 Bull 9 Bull 9 Giraffe 9 Moose 

Je souhaite afficher datatables sortingées par site, mais exclure les lignes qui se trouvaient dans un site précédent. Afficher tous les éléments du site 1 Tous les éléments du site 2 qui n'étaient pas déjà affichés dans le site 1, etc.

Donc, le résultat montre:

 Site Data ---- ---- 1 Cat 1 Mule 1 Pig 2 Dog 2 Giraffe 2 Horse 9 Moose 

La list initiale est construite à partir d'une requête avec plusieurs jointures.

Un exemple de travail serait:

 SELECT * FROM dbo.Sample WHERE Site = 1 UNION SELECT * FROM dbo.Sample WHERE Site = 2 AND Data NOT IN (SELECT Data FROM dbo.Sample WHERE Site < 2) UNION SELECT * FROM dbo.Sample WHERE Site = 8 AND Data NOT IN (SELECT Data FROM dbo.Sample WHERE Site < 8) UNION SELECT * FROM dbo.Sample WHERE Site = 9 AND Data NOT IN (SELECT Data FROM dbo.Sample WHERE Site < 9) ORDER BY Site 

Ma list de sites provient également d'une requête.

SELECT site distinct de SiteList

 1 2 4 8 9 

Sûrement il devrait y avoir un moyen facile et efficace de le faire?

Cela donnerait les résultats souhaités

 SELECT MIN(Site) AS Site, Data FROM dbo.Sample GROUP BY Data ORDER BY Site 

Vous pouvez utiliser ROW_NUMBER :

 WITH CTE AS ( SELECT s.*, RN = ROW_NUMBER () OVER (PARTITION BY Data Order By Site) FROM dbo.Sample s ) SELECT * FROM CTE WHERE RN = 1 ORDER BY Site 
 SELECT * FROM dbo.sample a WHERE site = (SELECT min(site) FROM dbo.sample b WHERE a.data=b.data) order by site 

Pas aussi élégant que la première solution, mais cela fonctionnera également si vous vous retrouvez avec d'autres colonnes (comme la couleur par exemple) avec des valeurs différentes et que vous ne voulez toujours qu'une ligne par animal.

Essaye ça

 SELECT min(site) FROM dbo.sample GROUP BY data ORDER BY 1