每分钟选择一条记录

时间:2011-07-19 12:10:36

标签: c# entity-framework group-by

我正在寻找一种让实体框架在数据库字段中每分钟返回一条记录的方法,例如对于下表:

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)

这可能只有一个查询吗?数据库非常大,所以我不想检索所有记录并在循环中选择它们。

3 个答案:

答案 0 :(得分:1)

我使用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);
        }
    }

答案 1 :(得分:0)

不确定确切的语法,但下面可能有所帮助。你可以进一步调整它以获得sql性能。

从idtable中选择*(从日期,小时,分钟中选择某个组中的maxid)

答案 2 :(得分:0)

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。 @Ross似乎有LINQ查询的答案。我将把SQL留在这里作为参考。