LINQ查询从一个组中选择前3名,并获得所选结果的平均值

cl25kdpy  于 2024-01-03  发布在  其他
关注(0)|答案(1)|浏览(246)

我想:
1.为每个schedule_Region_ids选择未通过qc(QC=1)的箱
1.选择没有QC失败标记(1)的前3个箱(例如,如果没有QC标记=1,则为箱3、4和5)
1.取3个选定值的平均值,为每个schedule_Region_id创建“BaselPeak”。
我尝试了以下代码:

  1. var categories = drugonboard
  2. .Where(p => p.Field<int?>("QC") != 1)
  3. .OrderByDescending(x => x.Field<int>("bin")).Take(3)
  4. .GroupBy(t => new { ID = t.Field<int>("schedule_region_id")})
  5. .Select(g => new
  6. {
  7. schedule_region_id = g.Key.ID,
  8. BaselPeak = g.Average(p => p.Field<double>("AnalytePeak"))
  9. });

字符串
然而,我最终得到的是前3个schedule_region_id,而不是每个schedule_region_id的前3个bin的平均值。如果我先尝试GroupBy,那么我会得到匿名类型错误。
我有一个数据集,看起来像这样:

  1. id | bin | AnalytePeak | QC
  2. 1 | 1 | 620 |
  3. 1 | 2 | 1020 |
  4. 1 | 3 | 681 | 1
  5. 1 | 4 | 1190 |
  6. 1 | 5 | 1200 |
  7. ---------------------------
  8. 2 | 1 | 1020 |
  9. 2 | 2 | 1076 |
  10. 2 | 3 | 1190 |
  11. 2 | 4 | 1200 |
  12. 2 | 5 | 358 | 1
  13. ---------------------------
  14. 3 | 1 | 1020 |
  15. 3 | 2 | 1076 |
  16. 3 | 3 | 1190 |
  17. 3 | 4 | 1200 |
  18. 3 | 5 | 1358 |

jm2pwxwz

jm2pwxwz1#

在分组和排序子记录后,您需要取3。

  1. var categories = drugonboard
  2. .Where(p => p.Field<int?>("QC") != 1)
  3. .GroupBy(t => new { ID = t.Field<int>("schedule_region_id")})
  4. .Select(g => new {
  5. schedule_region_id = g.Key.ID,
  6. BaselPeak = g.OrderByDescending(x => x.Field<int>("bin"))
  7. .Take(3)
  8. .Average(p => p.Field<double>("AnalytePeak"))
  9. });

字符串
这是假设:如果所有的bin都是QC=1,那么你根本不需要schedule_region_id父节点,而top 3是指最高的3个bin编号。

相关问题