2012-07-18 3 views
1

J'essaie de créer une requête qui va trier par Name et Year, filtrer les doublons avec des années plus élevées et retourner ces enregistrements dans une table. Mes données ressemble actuellement à ceci:SQL pour retourner les enregistrements non-dupliqués

ID-----Name-----Year 
1  Bob  2010 
2  John  2014 
3  Bob  2004 
4  Eric  2005 

Les données doivent être principalement triées par Name puis secondairement trié par Year de façon descendante, comme ceci:

ID-----Name-----Year 
3  Bob  2004 
1  Bob  2010 
4  Eric  2005 
2  John  2014 

DUPLICATE Name dossiers doivent être filtre retour seul le Year le moins comme ceci:

ID-----Name-----Year 
3  Bob  2004 
4  Eric  2005 
2  John  2014 

J'ai essayé des choses comme SELECT DISTINCT et HAVING COUNT mais je n'arrive pas à l'obtenir. Manquant probablement quelque chose de simple. De l'aide?

+0

Quelle base de données utilisez-vous? – RedFilter

+0

Votre premier exemple de données ne correspond pas à votre seconde. – RedFilter

+0

Merci, je l'ai réparé. – aus

Répondre

5
select ID, Name, Year 
from (
    select ID, Name, Year, Rank() over (partition by Name order by year) as Rank 
    from MyTable 
) t 
where Rank = 1 

SQL FIddle Example #1

Si vous ne pouvez pas utiliser PARTITION, vous pouvez le faire:

select m.ID, m.Name, m.Year 
from (
    select Name, min(Year) as MinYear 
    from MyTable 
    group by Name 
) mm 
inner join MyTable m on mm.Name = m.Name and mm.MinYear = m.Year 

SQL Fiddle Example #2

+0

Merci. C'est ce dont j'avais besoin! – aus

1
SELECT Name, MIN(Year) FROM table 
GROUP BY Name 
ORDER BY Name ASC 
+0

probablement vouloir changer l'année à ASC ainsi – lusketeer

+0

@ user1301840 vous avez raison, était en train de lire la question ("' Year' d'une manière descendante ") plutôt que de regarder le résultat. – Kermit

+0

Pourriez-vous corriger la requête? Supprimer "id" de la sélection. Supprimer "année" de la commande par. L'idée derrière votre solution est bien, mais la requête ne l'est pas. –

0

supposant MySQL

select min(id), name, min(year) 
from (
select distinct t1.id, t1.name, t2.year 
from tbl t1, tbl t2 
odrer by t1.name, t2.year 
) T 
group by name 
Questions connexes