每分钟选择一条记录

本文关键字:记录 一条 选择 每分钟 | 更新日期: 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留在这里以供参考。