0

我的表(示例)

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 的最大值,但不是该行的 temp

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

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

4

2 回答 2

1

这称为检索所谓的分组最大值,这是一个非常常见的问题,因为直观地说,您会认为与 with 结合使用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
于 2012-06-22T19:02:30.307 回答
0
select m.mid, m.console, m.zone, timestamp, temp 
from TABLE t
, (select max(id) mid,console,zone from table group by console,zone ) m
where t.id = m.mid
and t.zone = m.zone
and t.console = m.console
group by m.console, m.zone 
order by 2,3;
于 2012-06-22T18:42:45.590 回答