我有以下数据:
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。
我需要选择具有最新DATE的记录。一旦获得了具有最新日期的记录,那么它应该选择具有最高CUTR值的记录。
这是我到目前为止的问题:
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 :(得分:1)
您忘记了cutr子句。您已经在g中的rowGroup中执行了操作,其中 rowGroup.date == maxDate选择rowGroup,只需再添加一个 声明的可爱。而且即使您只需要一行 可能有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();
希望它能起作用
答案 1 :(得分:0)
您不是在CUTR列上设置条件,而只是获得具有MAXDATE条件的行,在本示例中该行给出了两行。
您应按以下方式替换查询:
从lstCustomer中的行
将一行一行地分组到g
让maxDate = g.Max(r => r.date)
令maxCUTR = g.Max(r => r.CUTR)
来自g中的rowGroup
其中rowGroup.date == maxDate && rowGroup.CUTR == maxCUTR
选择rowGroup