【问题标题】:Datatable.Select with max(col) and WHERE clause?Datatable.Select 带有 max(col) 和 WHERE 子句?
【发布时间】:2014-02-05 21:22:21
【问题描述】:

我有一个包含以下数据的数据表。

Week    Score           Rank
1       75.8300000000   1
2       76.6800000000   9
3       79.8787870000   4
4       0               0
5       0               0
6       0               0
7       0               0
...
53      0               0

如果数据表只有前 3 周(有 Rank 的周),那么以下行将完美运行。但是现在我需要添加一个获取 MAX(Week) 的 WHERE 子句,其中 Score 大于 0。在这种情况下,返回的行将是第 3 周。本质上,查询将是 SELECT max(week) From datatable 其中排名 > 0

DataRow[] dr = dsRanks.Tables[0].Select("Week = MAX(Week)");

我尝试了以下方法,但由于返回了 0 行,因此出现索引错误。

DataRow[] dr = dsRanks.Tables[0].Select("Week = MAX(Week) and Rank > 0");

感谢任何帮助。

谢谢。

【问题讨论】:

  • 我不知道weeknum 来自哪里。

标签: c#


【解决方案1】:

改用 LINQ 更容易解决:

var week = dsRansk.Tables[0].AsEnumerable()
    .Where(row => row.Field<int>("Rank") > 0)
    .Max(row => row.Field<int>("Week"));

【讨论】:

  • 如何将周转换为 DataRow[]?
  • @user2520528 你没有,因为它不是一个数据行数组,它是一个整数。无法将整数转换为数据行数组。如果您希望给定的行代表该周,您可以使用OrderByDescending 而不是Max,然后在该结果上使用Take(1)First,如果您愿意的话。
【解决方案2】:

在我看来,您想要具有有效数据的最高周数的数据行。应该这样做:

var dr = dsRanks.Tables[0].Select("Rank > 0", "Week ASC"). LastOrDefault();

根据您的示例 dr 是第 3 周的数据行。

【讨论】:

  • 谢谢。这有效,并且 LastOrDefault() 避免了“序列不包含元素”异常。
  • @user2520528 很高兴我能帮上忙。如果您没有更多问题,请记住将其标记为已回答。谢谢
  • @user2520528 这是帮助页面的Link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2012-11-20
  • 2015-09-28
  • 2018-12-02
  • 1970-01-01
  • 2018-01-15
相关资源
最近更新 更多