我的表(示例)
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;
上面的查询返回正确的条目数,但是正如我提到的那样,temp将不正确。我总是得到第一个临时表输入控制台&区。我看起来相当多,要么不知道要问什么问题,要么答案很简单,并且为了神的娱乐而躲避我。
答案 0 :(得分:1)
这称为检索所谓的分组最大值,这是一个非常常见的问题,因为直观地说,你会想到在{{1}中使用MAX()
与SELECT
结合使用会给出正确的相应行,但事实并非如此。
相反,您必须在子查询中包含最大值的选择,然后在子查询的最大值等于您想要从中检索最大值的任何字段的条件下执行自连接,以便检索正确的行: / p>
您的表格结构使解决方案相当简单,因为您的最大值基本上只是一个唯一的自动递增ID:
试试这个:
GROUP BY
答案 1 :(得分: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;