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