Как вернуть строки с максимальным значением одного столбца, сгруппированного по другому столбцу? - PullRequest
4 голосов
/ 21 июля 2010

это данные

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

что мне нужно в результате это:

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

другими словами, для группировки по коду мне нужны все строки с максимальным идентификатором.

например, для кода 3, идентификаторы 6, 7, 8, и мне нужно строка с 8.

эквивалентный SQL-запрос будет

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

Столбец состояния не имеет значения, это просто атрибут.

Что такое запрос linq для чего-то подобного?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 21 июля 2010
from t in mytable
where !(from tt in mytable
        where tt.code == t.code &&
              tt.id > t.id
        select tt
       ).Any()
select t
1 голос
/ 21 июля 2010

Буквальный выбор победителя

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;

Более традиционный выбор победителя (нет шансов на автоматическую загрузку групповых элементов)

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;

Точное соответствие вашему опубликованному 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...