Mysql 获取过去30分钟的数据并获取最新的行

Mysql 获取过去30分钟的数据并获取最新的行,mysql,sql,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 ti

我有一个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

似乎除了时间戳之外,所有的数据都是旧的。

嗯,这里有一个语法错误。正如我不久前所解释的,您不能在
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
子句。您以前的查询应该按以下方式编写(但我不确定这是否是您想要的):


然而,我确实认为,您可能正在寻找每个组中的最大值,这应该通过不同的查询来解决。。。但是正如我所说的,我没有足够的信息来说明这个问题。

如果您希望每个唯一的“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))

链接肯定会帮助你…@FahimParkar Parkar:那链接对我有什么帮助?这解释了为什么我的数据过时了,它读取的是时间戳。是的,我可能需要在间隔之后过滤数据,在同一个查询中可以这样做吗?可以。看看答案。
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))