每分钟选择一条记录
本文关键字:记录 一条 选择 每分钟 | 更新日期: 2023-09-27 18:02:59
我正在寻找一种方法,让实体框架在数据库字段中每分钟返回一条记录,例如下表:
Message | Timestamp
--------+--------------------
a | 2011-01-02 12:31:10
b | 2011-01-02 12:31:15
c | 2011-01-02 12:31:59
d | 2011-01-02 12:32:01
e | 2011-01-02 12:32:30
f | 2011-01-02 12:33:10
我想要一个返回的查询
c,e,f (c and e are selected because they are the latest entries)
这可能只需要一个查询吗?数据库很大,所以我不想检索所有记录并在循环中选择它们。
我使用Linq作为内存中的集合,而不是EF,但您应该能够很容易地适应它。
private static void LinqExample()
{
var a = new object[]
{
new object[] {"a", DateTime.Parse(" 2011-01-02 12:31:10")},
new object[] {"b", DateTime.Parse(" 2011-01-02 12:31:15")},
new object[] {"c", DateTime.Parse(" 2011-01-02 12:31:59")},
new object[] {"d", DateTime.Parse(" 2011-01-02 12:32:01")},
new object[] {"e", DateTime.Parse(" 2011-01-02 12:32:30")},
new object[] {"f", DateTime.Parse(" 2011-01-02 12:33:10")},
};
var result = from pair in a
let msg = (string) ((object[]) pair)[0]
let date = (DateTime) ((object[]) pair)[1]
group new {date, msg} by new {date.Year, date.Month, date.Day, date.Hour, date.Minute}
into dateGroup
select dateGroup.OrderBy(dg => dg.date).Last();
foreach (var res in result)
{
Console.WriteLine(res.msg);
}
}
不确定确切的语法,但下面可能会有所帮助。您可以针对sql性能对其进行进一步调整。
从id所在的某个表中选择*(按日期、小时、分钟从某个表组中选择maxid(
SELECT
MAX([Message])
FROM
[Messages]
GROUP BY
DATEPART(yyyy, [Timestamp])
,DATEPART(mm, [Timestamp])
,DATEPART(dd, [Timestamp])
,DATEPART(hh, [Timestamp])
,DATEPART(mi, [Timestamp])
这假设Message列与Timestamp列相关,如示例数据所示。
更新:
刚刚看到这是在寻找EF,而不是直接的SQL@罗斯似乎找到了LINQ问题的答案。我将SQL留在这里以供参考。