我有一张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
似乎除时间戳之外的所有数据都是旧的。
答案 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
但我确实认为,您可能正在寻找每个组的最大最大值,这应该通过不同的查询来解决......但正如我所说,我没有足够的信息来总结这一点。