【问题标题】:Get data from last 30 minutes and get the latest rows获取最近 30 分钟的数据并获取最新的行
【发布时间】:2012-03-16 07:26:31
【问题描述】:

我有一张经常更新的 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

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

【问题讨论】:

  • this 链接一定会帮助你...
  • @FahimParkar Parkar:这个链接对我有什么帮助?

标签: mysql sql


【解决方案1】:

如果您想要最近 30 分钟的每个唯一“mmsi”的最新行,那么使用连接到子查询,您首先可以找到最大时间戳,例如:

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

【讨论】:

    【解决方案2】:

    嗯,这里有一个语法错误。正如我前段时间解释的here,您不能在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 分钟数据,然后仅从该子集中获取最新数据...不是和获取最新数据?

    另外,将所有其他字段添加到 group by 可能是个好主意。

    或者,也许我搞错了。你能详细说明一下吗?

    编辑:要过滤分组数据,您需要添加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
    

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

    【讨论】:

    • 这解释了为什么我的数据已经过时,它正在读取时间戳。是的,我可能需要在间隔之后过滤数据,是否可以在同一个查询中执行此操作?
    • 是的,你可以。看看答案。
    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2016-08-20
    相关资源
    最近更新 更多