[英]Get data from last 30 minutes and get the latest rows
我有一张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
似乎除时间戳之外的所有数据都是旧的。
如果你想要每个唯一的“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))
好吧,那里有句法错误。 正如我解释这里前一段时间,你不能引用在计算领域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
但是,我确实认为你可能正在寻找每个组的最大最大值,这应该通过不同的查询来解决......但正如我所说,我没有足够的信息来得出结论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.