2010-06-03 6 views
1

Comment puis-je filtrer mes résultats dans une requête? exempleSQL DISTINCT Valeur Question

J'ai 5 enregistrements

John, Smith, pomme
Jane Doe, pomme
Fred, James, pomme
Bill, evans, orange
Willma, Jones, raisin

Maintenant, je veux une requête qui me ramènerait 3 enregistrements avec le fruit DISTINCT, MAIS ... et voici la partie difficile, je veux toujours les colonnes pour Prénom, Dernier Prénom. PS Je ne se soucient pas lequel des trois il retourne l'esprit, mais je besoin seulement revenir 3 (ou ce que jamais combien de fruits DISTINCT il y a.

retour ex serait

John, Smith , pomme
Bill, evans, orange
Willma, Jones, raisin

Merci à l'avance que j'ai frappais ma tête toute la journée.

Répondre

3

Bizarrement enou gh, la meilleure solution n'implique pas GROUP BY.

WITH DistinctFruit AS (
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY Fruit ORDER BY LastName) AS FruitNo, 
     LastName, 
     FirstName, 
     Fruit 
    FROM table) 
SELECT FirstName, LastName, Fruit 
FROM DistinctFruit 
WHERE FruitNo = 1; 
+0

Puis-je demander pourquoi est-ce mieux que GROUP BY? Plus rapide? Cela semble être moins lisible/simple, donc je suppose que la victoire est sur la performance? – DVK

+0

Le faire avec un GROUP BY pourrait être fait si vous utilisez un sous-ensemble imbriqué, mais ce n'est pas très lisible du tout et fonctionnera très mal. En fait, vous n'auriez même pas besoin de GROUP BY pour cette solution - vous pourriez simplement utiliser TOP et DISTINCT. –

+0

+1. Belle solution CTE. –

0

Si vous avez une petite quantité de données (pas des dizaines de milliers de lignes), vous pouvez faire des sous-requêtes.

select distinct t1.fruit as Fruit, 
    (select top 1 t2.lastname 
    from t1 as t2 
    where t1.fruit = t2.fruit 
    order by t2.lastname) as LastName, 
    (select top 1 t2.firstname 
    from t1 as t2 
    where t1.fruit = t2.fruit 
    order by t2.lastname, t2.firstname) as FirstName 
from t1 

Notez que la colonne FirstName est triée de la même manière que la colonne LastName. Cela vous donnera un nom de famille correspondant avec le prénom correct.

Voici mes données de test:

create table t1 
(firstname varchar(20), 
lastname varchar(20), 
fruit varchar(20)) 


insert into t1 
values ('John','Smith','apple') 
insert into t1 
values ('Jane','Doe','apple') 
insert into t1 
values ('Fred','James','apple') 
insert into t1 
values ('Bill','evans','orange') 
insert into t1 
values ('Willma','Jones','grape') 
0

Juste une autre solution

select distinct x.*,fruit from t1 
    cross apply 
    (select top 1 firstname, lastname from t1 t2 where t1.fruit=t2.fruit) x 
0
SELECT DISTINCT x.*,fruit FROM peopleFruit pf 
CROSS APPLY 
(SELECT TOP 1 firstname, lastname FROM peopleFruit pf1 WHERE pf.fruit=pf1.fruit) x