Получить данные за последние 30 минут и получить последние строки - PullRequest
2 голосов
/ 26 февраля 2012

У меня есть таблица с морскими данными AIS, которая обновляется очень часто.

Мне нужны данные за последние 30 минут, и из этого результата самые новые строки и MMSI должны быть уникальными.

Запрос у меня сейчас:

select max(timestamp) as timestamp, mmsi, navstatus, rot, sog, lon, lat, cog,
thead, man, mtype from ais_cnb
where (timestamp > (now() - interval 30 minute))
group by mmsi
order by timestamp desc

Кажется, что все данные, кроме отметки времени, устарели.

Ответы [ 2 ]

9 голосов
/ 26 февраля 2012

Если вы хотите получить последнюю строку из последних 30 минут для каждого уникального «mmsi», в котором она есть, тогда следует использовать соединение с подзапросом, в котором сначала будет найдено максимальное время, например:

SELECT timestamp, a.mmsi, navstatus, rot, sog, lon, lat, cog, thead, man, mtype
FROM ais_cnb a INNER JOIN
(SELECT mmsi, MAX(timestamp) AS max_timestamp FROM ais_cnb
 WHERE timestamp > (now() - interval 30 minute)
 GROUP BY mmsi) t
ON ((timestamp = t.max_timestamp) AND (a.mmsi = t.mmsi))
3 голосов
/ 26 февраля 2012

Ну, там есть синтаксическая ошибка.Как я объяснил здесь некоторое время назад, вы не можете ссылаться на вычисляемое поле в предложении where, поэтому полученная метка времени на самом деле является полем, а не агрегированной функцией (max()).Вы не поняли это, потому что назвали это так же, как поле.Попробуйте выполнить это, и вы увидите:

select max(timestamp) as timestamp2, mmsi, navstatus, rot, sog, lon, lat, cog,
thead, man, mtype from ais_cnb
where (timestamp2 > (now() - interval 30 minute))
group by mmsi
order by timestamp desc

Теперь, независимо от того, правильно ли вы выбираете эти записи или нет, если вы сначала получите все последние 30-минутные данные, а затем вы получите тольконовейшие данные из этого подмножества ... разве это не то же самое, что получение новейших данных?

Кроме того, было бы неплохо добавить все остальные поля в группу с помощью.

Или, может быть, я что-то не так делаю.Не могли бы вы уточнить это?

Редактировать: Чтобы отфильтровать сгруппированные данные, необходимо добавить предложение HAVING.Ваш предыдущий запрос должен быть написан следующим образом (но я не уверен, что это то, что вы ищете):

select max(timestamp) as timestamp2, mmsi, navstatus, rot, sog, lon, lat, cog,
thead, man, mtype from ais_cnb
group by mmsi
having (timestamp2 > (now() - interval 30 minute))
order by timestamp desc

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

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