Выберите одну запись в минуту - PullRequest
2 голосов
/ 19 июля 2011

Я ищу способ заставить Entity Framework возвращать одну запись за каждую минуту в поле базы данных, например, для таблицы ниже:

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 ]

1 голос
/ 19 июля 2011

Я использую 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);
        }
    }
0 голосов
/ 19 июля 2011
SELECT 
    MAX([Message]) 
FROM 
    [Messages]
GROUP BY 
    DATEPART(yyyy, [Timestamp])
    ,DATEPART(mm, [Timestamp])
    ,DATEPART(dd, [Timestamp])
    ,DATEPART(hh, [Timestamp])
    ,DATEPART(mi, [Timestamp])

Предполагается, что столбец «Сообщение» соотносится со столбцом «Временная метка», как показано в примере данных.

UPDATE

Только что увидел, что это ищет EF, а не прямой SQL. @Ross, кажется, имеет ответ на запрос LINQ. Я оставлю здесь SQL для справки.

0 голосов
/ 19 июля 2011

Не уверен в точном синтаксисе, но ниже может помочь.Вы можете настроить его дальше для производительности sql.

Выберите * из sometable, где id в (выберите maxid из sometable группы по дате, часу, минуте)

...