Как выбрать самый последний набор датированных записей из таблицы MySQL

mysql sql date greatest-n-per-group

98140 просмотра

7 ответа

Я храню ответ на различные вызовы rpc в таблице mysql со следующими полями:

Table: rpc_responses

timestamp   (date)
method      (varchar)
id          (varchar)
response    (mediumtext)

PRIMARY KEY(timestamp,method,id)

Каков наилучший метод выбора самых последних ответов для всех существующих комбинаций methodи id?

  • Для каждой даты может быть только один ответ для данного метода / идентификатора.

  • Не все комбинации вызовов обязательно присутствуют на определенную дату.

  • Есть десятки методов, тысячи идентификаторов и как минимум 365 разных дат

Пример данных:

timestamp  method  id response
2009-01-10 getThud 16 "....."
2009-01-10 getFoo  12 "....."
2009-01-10 getBar  12 "....."
2009-01-11 getFoo  12 "....."
2009-01-11 getBar  16 "....."

Желаемый результат:

2009-01-10 getThud 16 "....."
2009-01-10 getBar 12 "....."
2009-01-11 getFoo 12 "....."
2009-01-11 getBar 16 "....."

(Я не думаю, что это тот же вопрос - он не даст мне самый последний response)

Автор: Ken Источник Размещён: 12.11.2019 09:09

Ответы (7)


28 плюса

Используйте это решение с осторожностью:
в будущих версиях mysql не гарантируется
работа, в mariadb 5.5 неизвестно

Этот запрос может работать хорошо, потому что нет никаких соединений.

SELECT * FROM (
    SELECT timestamp, method, id, response
    FROM rpc_responses
    WHERE 1 # some where clause here
    ORDER BY timestamp DESC
) as t1
GROUP BY method

Функция «group by» сворачивает набор результатов для метода и возвращает только 1 строку для каждого метода, самую последнюю из-за временной метки DESC ORDER BY во внутреннем запросе.

К вашему сведению, PostgreSQL имеет способ сделать это встроенным в язык:

SELECT DISTINCT ON (method) timestamp, method, id, response
FROM rpc_responses
WHERE 1 # some where clause here
ORDER BY method, timestamp DESC
Автор: velcrow Размещён: 27.09.2012 04:11

14 плюса

Решение

Сам ответил, но я не уверен, что это будет достаточно эффективное решение по мере роста таблицы:

SELECT timestamp,method,id,response FROM rpc_responses 
INNER JOIN
(SELECT max(timestamp),method,id FROM rpc_responses GROUP BY method,id) latest
USING (timestamp,method,id);
Автор: Ken Размещён: 12.01.2009 03:12

6 плюса

Попробуй это...

SELECT o1.id, o1.timestamp, o1.method, o1.response   
FROM rpc_responses o1
WHERE o1.timestamp = ( SELECT max(o2.timestamp)
                       FROM rpc_responses o2
                       WHERE o1.id = o2.id )
ORDER BY o1.timestamp, o1.method, o1.response

... это даже работает в Access!

Автор: versek Размещён: 06.07.2010 11:05

0 плюса

я использовал это, работал на меня

select max(timestamp),method,id from tables where 1 group by method,id order by timestamp desc 
Автор: charles Размещён: 03.05.2012 01:32

0 плюса

Подзапрос очень обременителен, когда набор данных становится больше.

Попробуй это:

SELECT t1.* 
FROM rpc_responses AS t1 
INNER JOIN rpc_responses AS t2 
GROUP BY t1.method, t1.id, t1.timestamp
HAVING t1.timestamp=MAX(t2.timestamp)    
ORDER BY t1.timestamp, t1.method, t1.response;
Автор: Simon Размещён: 26.07.2011 04:40

-1 плюса

Понятие «самый последний» довольно расплывчато. Если вы имеете в виду что-то вроде 100 самых последних строк, то вы можете просто добавить TOP(100)к своему SELECTпредложению.

Если вы имеете в виду «самый последний» на основе самой последней даты, то вы можете просто сделать

SELECT timestamp,method,id,response 
FROM rpc_responses
HAVING max(timestamp) = timestamp 
Автор: Neil Размещён: 12.01.2009 03:22

-2 плюса

... прошло больше года, но я мог бы помочь кому-то выбрать все запросы, начиная с последней

SELECT *
FROM rpc_responses
ORDER BY timestamp DESC
Автор: spi Размещён: 06.06.2010 09:25
Вопросы из категории :
32x32