【发布时间】:2017-08-11 08:27:52
【问题描述】:
我正在研究一个案例,其中我们有许多装满液体的水箱。测量液体量并将信息存储在数据库中。此更新每 5 分钟完成一次。这里存储了以下信息:
- 坦克ID
- 填充级别
- 时间戳
每个水箱都归类在以下“液位”范围之一:
- 范围 A:0 - 40%
- 范围 B:40 - 75%
- 范围 C:75 - 100%
每个范围我计算每个 tankId 的事件数量。
SELECT sum(
CASE
WHEN filllevel>=0 and filllevel<40
THEN 1
ELSE 0
END) AS 'Range A',
sum(
CASE
WHEN filllevel>=40 and filllevel<=79
THEN 1
ELSE 0
END) AS 'Range B',
sum(
CASE
WHEN filllevel>79 and filllevel<=100
THEN 1
ELSE 0
END) AS 'Range C'
FROM TEST ;
挑战在于只计算每个坦克的最新记录。因此,对于每个 tankId,只有一个计数(并且必须是具有最新时间戳的记录)。
对于以下数据:
insert into tank_db1.`TEST` (ts, tankId, fill_level) values
('2017-08-11 03:31:18', 'tank1', 10),
('2017-08-11 03:41:18', 'tank1', 45),
('2017-08-11 03:51:18', 'tank1', 95),
('2017-08-11 03:31:18', 'tank2', 20),
('2017-08-11 03:41:18', 'tank2', 30),
('2017-08-11 03:51:18', 'tank2', 80),
('2017-08-11 03:31:18', 'tank3', 30),
('2017-08-11 03:41:18', 'tank3', 45),
('2017-08-11 03:51:18', 'tank4', 55);
我希望结果是(仅计算每个 tankId 具有最新时间戳的记录):
- RANGE A: 0
- RANGE B: 1 (tankdId 3)
- RANGE C: 2 (tankId 1 and tankId2)
如果您是专家,这可能很容易,但对我来说,很难看到有哪些选择。
谢谢
【问题讨论】:
-
您需要坦克的数量还是坦克的名称?
-
“只是”每个范围的坦克总数。但是,如果坦克名称列表很简单,我也许可以使用它:-)
-
范围
B的值应该是2,因为还有tankId=4。 -
锐利的眼睛!。 tankId=4 确实是一个错字(但应该可以)