2010-07-21 6 views
4

ce sont des donnéesComment retourner des lignes avec une valeur maximale d'une colonne groupée par une autre colonne?

id  code  status 
1   1   5 
2   1   6 
3   2   8 
4   2   9 
5   2   12 
6   3   15 
7   3   19 
8   3   13 

ce que je dois en conséquence est la suivante:

id  code  status 
2   1   6 
5   2   12 
8   3   19 

-à-dire que j'ai besoin de lignes al avec id max en groupe par code.

par exemple, pour le code 3, ids sont 6, 7, 8 et je dois ramer 8.

requête SQL équivalente serait

select * 
from t inner join (select max(id) maxId from t group by code) t1 
on t.id = t1.maxId 

colonne État est irelevant, il est juste un atribute .

Quelle est la requête linq pour quelque chose comme ça?

Merci d'avance.

Répondre

3
from t in mytable 
where !(from tt in mytable 
     where tt.code == t.code && 
       tt.id > t.id 
     select tt 
     ).Any() 
select t 
+0

L'état est non pertinent. C'est juste un code d'attribut et les identifiants sont ce que les metters! Mais je vais essayer d'utiliser quelque chose de cela. – 100r

+0

Désolé, j'ai mal lu la question. Fixé. –

+0

chose intéressante se passe. ma requête renvoie 110345 lignes an vôtre retourne 110346 lignes :/ je ne sais pas pourquoi .. – 100r

1

littérales Pick-a-gagnant

from row in rows 
group row by row.code into g 
let winner = 
(
    from groupedrow in g 
    order groupedrow by groupedrow.id desc 
    select groupedrow 
).First() 
select winner; 

Plus Pick-a-gagnant traditionnel (pas de chance de roundtrips--aller chercher élément de groupe automatique)

var subquery = 
    from row in rows 
    group row by row.code into g 
    select new {Code = g.Key, Id = g.Max(row => row.Id)}; 

var query = 
    from row in rows 
    join key in subquery on new{row.Code, row.Id} == key 
    select row; 

Exact match à votre Posté sql:

IQueryable<int> subquery = 
    from row in rows 
    group row by row.code into g 
    select g.Max(row => row.Id); 

var query = 
    from row in rows 
    join key in subquery on row.Id == key 
    select row; 
Questions connexes