我想在最近一小时内找到C#DataTable中最新最大值的行号,其中包含以下列:名称分数UnixTS。但似乎无法使查询正确。我可以轻松地从所有值获取最新最大值的行号,或者只要一小时尚未通过。但是一旦超过一小时,如果存在较早的最大值,则行号为空。
我试过了:
query = "UnixTS > " + fromUnixTS + " AND [Score] = MAX([Score])";
theRow = scoreTable.Select(query, "UnixTS DESC");
或
query = "[Score] = MAX([Score]) where UnixTS > fromUnixTS";
其中fromUnixTS现在是 - 3600。甚至是类似SQL的查询:
query = "SELECT * MAX([Score]) FROM scoreTable WHERE UnixTS > fromUnixTS ORDER BY UnixTS LIMIT 1":
或:
var theRow = scoreTable.AsEnumerable().Where(row => row.Field<int>("UnixTS") > fromUnixTS).Max(row => row.Field<int>("Score")).OrderByDescending<int>("UnixTX");
但没有运气。好吧,我不熟悉C#,但任何帮助都会受到赞赏吗?
嗯,似乎无法使用WHERE--(但我找到了前进的方法:query = "UnixTS > " + fromUnixTS";
theRow = scoreTable.Select(query, "Score DESC, UnixTS DESC");
不是我必须承认的最聪明的方式。难道没有一种聪明的方式来使用MAX吗?
答案 0 :(得分:1)
这样的东西?
DataTable scoreTableNew = scoreTable.AsEnumerable().Where(x => x.Field<DateTime>("UnixTS") > DateTime.Now.AddHours(-1)).OrderByDescending(y => y["Score"]).Take(1).CopyToDataTable();
我们首先获取最后一小时的所有行,按降序按分数排序,然后选择最上一行。
Linq中没有MAX,除非你使用morelinq扩展名(你可以从NuGet获得morelinq)。它有MaxBy
。
<强>更新强>
DataTable scoreTable = new DataTable();
scoreTable.Columns.Add("UnixTS", typeof(DateTime));
scoreTable.Columns.Add("Score", typeof(int));
scoreTable.Rows.Add(DateTime.Now.AddMinutes(-30), 10);
scoreTable.Rows.Add(DateTime.Now.AddMinutes(-130), 40);
scoreTable.Rows.Add(DateTime.Now.AddMinutes(-59), 20);
scoreTable.Rows.Add(DateTime.Now.AddMinutes(-59), 20);
scoreTable.Rows.Add(DateTime.Now.AddMinutes(-20), 25);
DataTable scoreTableNew = scoreTable.AsEnumerable().Where(x => x.Field<DateTime>("UnixTS") > DateTime.Now.AddHours(-1)).OrderByDescending(y => y["Score"]).Take(1).CopyToDataTable();
Response.Write(Convert.ToDateTime(scoreTableNew.Rows[0][0]).ToShortDateString() + " - " + scoreTableNew.Rows[0][1].ToString());