获取最近30分钟的数据并获取最新的行

时间:2012-02-26 16:02:12

标签: mysql sql

我有一张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 个答案:

答案 0 :(得分:9)

如果您想要每个唯一的“mmsi”有最后一个30分钟的最新行,那么使用连接到子查询,您可以在其中找到最大时间戳应该有效,例如:

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))

答案 1 :(得分:3)

那里有一个语法错误。正如我前段时间解释的here,您无法在where子句中引用计算字段,因此您获得的时间戳实际上是字段,而不是聚合函数({{1 }})。你没有意识到这一点,因为你的命名方式与字段相同。试试这个,你会看到:

max()

现在,无论您是否正确选择这些记录,如果您首先获得所有最新的30分钟数据,然后您只获得该子集中的最新数据...是不是与获取最新数据?

此外,将所有其他字段添加到组中可能是个好主意。

或许我得错了。你能详细说明一下吗?

修改:要过滤分组数据,您需要添加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 子句。您之前的查询应按以下方式编写(但我不确定这是否是您要查找的内容):

HAVING

但我确实认为,您可能正在寻找每个组的最大最大值,这应该通过不同的查询来解决......但正如我所说,我没有足够的信息来总结这一点。