Mysql查询以获取给定项目编号的2个最新信息

Posted

技术标签:

【中文标题】Mysql查询以获取给定项目编号的2个最新信息【英文标题】:Mysql query to get 2 most recent for a given item number 【发布时间】:2008-12-09 23:58:28 【问题描述】:

我的数据库中有以下属性。

统计 id、设备名称、值、时间戳

对于给定的统计数据,我想找到每个唯一设备的 2 个最新时间戳和对应值。

我正在尝试类似的东西

试用 1)

select statistic, devicename, value, timestamp
from X_STATSVALUE
where statistic=19
order by orgtime DESC limit 2;

这给了我前 2 个时间戳,但不是每个设备。

试用 2)

select statistic, devicename, value, timestamp
from X_STATSVALUE as x 
where x.statistic=241
  and (select count(*)
       from X_STATSVALUE as y
       where y.statistic=x.statistic
         and y.device=x.device
         and y.timestamp > x.timestamp) <=1;

但这也不是很好..

基本上,对于给定的统计数据,我想要每个设备的 2 个最新时间戳和值。任何帮助都非常感谢 :)

【问题讨论】:

【参考方案1】:

这就是我解决这类问题的方法:

SELECT x.statistic, x.devicename, x.value, x.timestamp
FROM X_STATSVALUE AS x
  LEFT OUTER JOIN X_STATSVALUE AS x2
    ON (x.statistic = x2.statistic 
    AND x.devicename = x2.devicename 
    AND x.timestamp < x2.timestamp)
GROUP BY x.statistic, x.devicename
HAVING COUNT(*) < 2;

换句话说,显示的行使得具有相同statisticdevicename 以及更大(更新)timestamp 的其他行少于两行。

我假设对于给定的统计信息和设备名称,timestamp 列中不会有重复项。

【讨论】:

这只适用于 mysql。其他 RDBMS 会告诉您,您不能只按所选语句的一部分进行分组,而必须按全部四个进行分组。 问题是关于MySql的【参考方案2】:

我在我的系统上使用像您这样的演示表测试了以下查询,它可以工作。我考虑过 orgtime 而不是时间戳.. 你也可以这样做(只需更改名称)

    select t1.statistic, devicename, value, timestamp from X_STATSVALUE as t1 

    inner join 

    ( select statistic, max(orgtime) as orgtime from X_STATSVALUE group by statistic ) 
as t2 

    on t1.statistic = t2.statistic and t1.orgtime = t2.orgtime

    UNION

    select tb1.statistic, tb1.devicename, tb1.value, tb1.timestamp
    from X_STATSVALUE as tb1 inner join 

    ( select statistic, max(orgtime) as orgtime from X_STATSVALUE  WHERE statistic+orgtime not in 
    (select t1.statistic+t1.orgtime from X_STATSVALUE as t1 inner join 
    ( select statistic, max(orgtime) as orgtime from X_STATSVALUE group by statistic ) 
as t2 on t1.statistic = t2.statistic and t1.orgtime = t2.orgtime
    ) group by statistic 
    ) 

    as tb2 on tb1.statistic = tb2.statistic and tb1.orgtime = tb2.orgtime

【讨论】:

【参考方案3】:

试试类似的东西:

SELECT DISTINCT x.statistic, x.devicename, x.value, x.timestamp
FROM X_STATSVALUE AS x
WHERE x.timestamp IN (SELECT timestamp
                      FROM X_STATSVALUE
                      WHERE devicename = x.devicename AND statistic = x.statistic
                      ORDER BY timestamp LIMIT 2)

(但可能不适用于旧的 MySQL)

【讨论】:

以上是关于Mysql查询以获取给定项目编号的2个最新信息的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询以获取给定键的每个实例的最新行

使用 SQL 查询(MySQL 数据库)获取不同项目的最新“事件”

Mysql常见50条数据查询

复杂的 SQL 连接查询 - 获取最新行

Mysql查询-如何使用包含?

Oracle 使用 MAX 获取最新记录