У меня есть следующие данные:
DATE TYPE CUST PRAC CUTR ACTI
2018-02-22,HOME,9481 ,10 ,29204.0 ,QUS
2018-02-22,HOME,9481 ,23 ,39204.0 ,QUS
2018-02-22,HOME,9481 ,64 ,29204.0 ,QUS
2018-02-25,HOME,9481 ,35 ,49533.0 ,QUS
2018-02-25,HOME,9481 ,52 ,29452.0 ,QUS
2018-02-25,HOME,9481 ,52 ,29446.0 ,QUS
2018-02-25,HOME,9481 ,25 ,29532.0 ,QUS
2018-02-27,HOME,9481 ,52 ,29665.0 ,QUS
2018-02-27,HOME,9481 ,45 ,29664.0 ,QUS
2018-02-21,HOME,7540 ,53 ,29205.0 ,QUS
2018-02-22,HOME,7540 ,35 ,39205.0 ,QUS
В приведенных выше данных есть два клиента: 9841 и 7540.
Мне нужно выбрать запись с самой новой датой. Как только у меня будет запись с самой новой датой, она должна выбрать запись с самым высоким значением CUTR.
Это Linq, который я до сих пор:
List<clsCustomer> lstCustomer = (from row in lstCustomer
group row by row.cust into g
let maxDate = g.Max(r => r.date)
from rowGroup in g
where rowGroup.date == maxDate
select rowGroup).ToList();
Ниже приведены возвращаемые результаты:
DATE TYPE CUST PRAC CUTR ACTI
2018-02-27,HOME,9481 ,52 ,29665.0 ,QUS
2018-02-27,HOME,9481 ,45 ,29664.0 ,QUS
2018-02-22,HOME,7540 ,35 ,39205.0 ,QUS
Обратите внимание, что для клиента 9481 возвращены две строки. Он должен был вернуть только одну запись для каждого клиента. (последняя дата, ТОГДА наивысший CUTR).
Это должны быть правильные результаты. Обратите внимание, что он должен получить самую последнюю дату для каждого клиента. Тогда из этого результата получите самое высокое CUTR:
DATE TYPE CUST PRAC CUTR ACTI
2018-02-27,HOME,9481 ,52 ,29665.0 ,QUS
2018-02-22,HOME,7540 ,35 ,39205.0 ,QUS
Я почти там, но не могу понять, как убрать лишний ряд. Любая помощь будет оценена.
ОТВЕТ
Спасибо, Хабиб и всем за ответ:
var lstCustomer = (from row in lstCustomer
group row by row.cust into g
let maxDate = g.Max(r => r.date)
select g.Where(e => e.date == maxDate).OrderByDescending(e => e.cutr)
.FirstOrDefault()).ToList();
Вы забыли пункт о сокращении. Вы уже делаете из rowGroup в g, где rowGroup.date == maxDate выберите rowGroup, просто добавьте еще один такой оператор для cutr. И в случае, если вам нужна только одна строка, хотя может быть 2 с тем же CUTR. @Майк Макаров
var lstCustomer = from a in lstCustomer
group a by a.cust into g
let maxDate = g.Max(r => r.date)
select g.Where(e => e.date == maxDate).OrderByDescending(e => e.cutr)
.FirstOrDefault();
Надеюсь, это будет работать
Вы не устанавливаете условие для столбца CUTR, вы просто получаете строки с условием MAXDATE, которое дает две строки в этом примере.
Вы должны заменить свой запрос следующим образом:
из строки в группе lstCustomer строка по row.cust в g let maxDate = g.Max(r => r.date) let maxCUTR = g.Max(r => r.CUTR) из rowGroup в g, где rowGroup.date == maxDate && rowGroup.CUTR == maxCUTR выбрать rowGroup
rowgroup
, это не то, что он просил. Сначала он хотел сделать max (date), а затем на фильтре даты max (cutr).
cutr
. Вы уже делаетеfrom rowGroup in g where rowGroup.date == maxDate select rowGroup
, просто добавьте еще один такой оператор дляcutr
. И если вам нужна только одна строка, хотя может быть две строки с одинаковым CUTR, добавьте .Take.Take(5)