MySQL - запросить помощь в выборе результатов с последней отметкой времени, сгруппированной по дате - PullRequest
2 голосов
/ 16 марта 2011

У меня есть таблица, содержащая следующие поля: дата, время, узел, результат описание некоторых числовых результатов для разных узлов в разные даты и время в течение каждого дня. Типичный список будет выглядеть примерно так:

date       | time  | node | result
----------------------------------
2011-03-01 | 10:02 | A    | 10
2011-03-01 | 11:02 | A    | 20
2011-03-02 | 03:13 | A    | 23
2011-03-02 | 12:15 | A    | 18
2011-03-02 | 13:15 | A    | 8
2011-03-01 | 13:12 | B    | 2
2011-03-01 | 14:26 | B    | 1
2011-03-02 | 08:00 | B    | 6
2011-03-02 | 07:22 | B    | 3
2011-03-02 | 21:19 | B    | 4

Я хочу сформировать запрос, который будет получать последний результат каждого дня для каждого узла, так что я бы получил что-то вроде этого:

date       | time  | node | latest
-----------------------------------
2011-03-01 | 11:02 | A    | 20
2011-03-01 | 14:26 | B    | 1
2011-03-02 | 13:15 | A    | 8
2011-03-02 | 21:19 | B    | 4

Я думал о создании group by date, node, но затем извлечение последнего значения было беспорядком (я использовал group_concat( result order by time ) и использовал SUBSTRING(), чтобы получить последнее значение. Бааа, я знаю). Есть ли простой способ сделать это в MySQL?

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Я почти уверен, что видел похожий запрос, решающий его очень хорошо, без использования INNER JOIN, но я не могу найти его прямо сейчас (и, возможно, это был SQL Server), но все же должно работать следующее.

SELECT n.*
FROM   Nodes n
       INNER JOIN (
         SELECT MAX(time) AS Time
                , Date
                , Node
         FROM   Nodes
         GROUP BY
                Date
                , Node
       ) nm ON nm.time = n.time
               AND nm.Date = n.Date
               AND nm.Node = n.Node
1 голос
/ 16 марта 2011

Я бы подумал, что вам придется использовать что-то вроде функции Max (). Извините, у меня нет mysql, поэтому я не могу проверить, но я бы подумал что-то вроде этого

select t.date, t.node, t.latest, Max(time) from Table t Group By t.node, t.date

Я думаю, что агрегатная функция будет возвращать только одну строку на группу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...