繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM