我的桌子(例子)

id - console - zone - timestamp - temp
1  - 1       - 1    - 12:00     - 123
2  - 1       - 1    - 12:01     - 234
3  - 1       - 1    - 12:02     - 236
4  - 2       - 1    - 12:01     - 567
5  - 2       - 1    - 12:02     - 657
6  - 1       - 2    - 12:00     - 864
7  - 1       - 2    - 12:02     - 436


我的表每30-45秒更新一次,其中包含来自各种设备的新数据。我的目标是查询获取最新临时条目的每个控制台+区域的表(我可以通过id执行此表的自动递增操作)

理想的输出将是(示例)

 id - console - zone - timestamp - temp
 3  - 1       -  1   -  12:02    - 236
 5  - 2       -  1   -  12:02    - 657
 7  - 1       -  2   -  12:02    - 436


我试图在查询中使用max(),但是它没有按预期执行。我正在获取id的最大值,但不是该行的温度

select max(id), console, zone, timestamp, temp from TABLE group by console, zone order by console, zone;


上面的查询返回正确的条目数,但是正如我提到的那样,温度将是不正确的。我总是在表中输入控制台和区域的第一个临时工。我已经看了很多,要么不知道要问什么问题,要么答案很简单,使我为诸神的娱乐而迷惑。

最佳答案

这称为检索按组最大数,这是一个很常见的问题,因为从直觉上,您会认为将MAX()中的SELECTGROUP BY结合使用会为您提供正确的对应行, 但事实并非如此。

相反,您必须在子查询中包装对最大值的选择,然后在子查询的最大值等于您要从中检索最大值的任何字段的条件下进行自联接,以便检索正确的行:

您的表结构使解决方案变得相当简单,因为您的最大值基本上只是一个唯一的自动递增ID:

尝试这个:

SELECT
    b.*
FROM
    (
        SELECT MAX(id) AS maxid
        FROM tbl
        GROUP BY console, zone
    ) a
INNER JOIN
    tbl b ON a.maxid = b.id

10-06 05:42
查看更多