Linq группа путем создания дубликатов с использованием Max

2

У меня есть следующие данные:

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();
  • 0
    Вы забыли пункт о cutr . Вы уже делаете from rowGroup in g where rowGroup.date == maxDate select rowGroup , просто добавьте еще один такой оператор для cutr . И если вам нужна только одна строка, хотя может быть две строки с одинаковым CUTR, добавьте .Take .Take(5)
  • 0
    Используйте OrderByDescending, используя дату, затем возьмите первый элемент: List <clsCustomer> lstCustomer = row.AsEnumerable () .OrderByDescending (x => x.date) .GroupBy (x => x.cust) .Select (x => x.First ( )) .Составлять список();
Показать ещё 1 комментарий
Теги:
linq

2 ответа

1
Лучший ответ

Вы забыли пункт о сокращении. Вы уже делаете из 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();

Надеюсь, это будет работать

0

Вы не устанавливаете условие для столбца 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

  • 1
    Ваш ответ делает max (CUTR) для всей группы rowgroup , это не то, что он просил. Сначала он хотел сделать max (date), а затем на фильтре даты max (cutr).
  • 0
    Да, это правильно. Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню