Oracle环境下使用LINQ多分组统计事务最新记录的成功失败数咨询
实现方案
调整思路
现有统计逻辑已经完成了按日期分组的总数量统计,要新增成功/失败统计,只需要在原有查询基础上补充两个字段:
- 用来判断最终结果的状态字段(对应表中存储的成功/失败状态列)
- 用来判定分组内最新记录的时间排序字段(比如状态更新时间、处理完成时间,用主键自增ID也可以)
完整代码示例
假设状态字段为STATUS(成功存值"SUCCESS"、失败存值"FAILED",可替换为你实际业务的状态码),排序字段为PROCESS_END_TIME,修改后的代码如下:
// 基础查询:关联事务表、路由表,过滤时间范围,带出必要字段 var baseQuery = from filetrans in context.FILE_TRANSACTION join route in context.FILE_ROUTE on filetrans.FILE_TRANID equals route.FILE_TRANID where filetrans.PROCESS_STRT_TIME >= fromDateFilter && filetrans.PROCESS_STRT_TIME <= toDateFilter select new { PROCESS_DATE = DbFunctions.TruncateTime((DateTime)filetrans.PROCESS_STRT_TIME), filetrans.FILE_TRANID, route.DESTINATION, filetrans.STATUS, // 补充状态字段 filetrans.PROCESS_END_TIME // 补充用来取最新记录的排序字段 }; // 第一层分组:按日期、事务ID、目的地分组,取每组最新的状态 var groupWithLatestStatus = baseQuery .GroupBy(p => new { p.PROCESS_DATE, p.FILE_TRANID, p.DESTINATION }) .Select(g => new { g.Key.PROCESS_DATE, // 取分组内时间最大的那条的状态,作为该事务+目的地的最终结果 LatestStatus = g.OrderByDescending(x => x.PROCESS_END_TIME).FirstOrDefault().STATUS }); // 第二层分组:按日期聚合,统计总数量、成功数、失败数 var dailyResult = groupWithLatestStatus .GroupBy(x => x.PROCESS_DATE) .Select(g => new { Date = g.Key, TotalCount = g.Count(), // 总数量和原有逻辑一致 SuccessCount = g.Count(x => x.LatestStatus == "SUCCESS"), // 成功数 FailCount = g.Count(x => x.LatestStatus == "FAILED") // 失败数 }) .ToDictionary(a => a.Date, a => new { a.TotalCount, a.SuccessCount, a.FailCount });
注意事项
- 如果状态是用数字枚举存储的,把
"SUCCESS"/"FAILED"替换为对应的数值即可 - 如果没有专门的处理结束时间字段,可以用
PROCESS_STRT_TIME或者表的主键自增ID作为排序依据,只要能保证取到最新的一条记录即可 - 该写法兼容Oracle EF驱动的LINQ转SQL逻辑,不会出现本地计算的性能问题
内容的提问来源于stack exchange,提问作者VMK
相关产品推荐
相关产品推荐

