是否可以根据时间线获得最小和最大时间戳?我将在停车示例中解释它。
+---------------------+------+--------+-------+------------+
| ts | pos | posidx | car | carowner |
+---------------------+------+--------+-------+------------+
| 2016-02-16 20:15:02 | Lev2 | 3 | Volvo | Mr Johnson |
| 2016-02-16 20:30:02 | Lev2 | 3 | Volvo | Mr Johnson |
| 2016-02-16 20:35:01 | Lev2 | 2 | Volvo | Mr Johnson |
| 2016-02-16 22:20:01 | Lev2 | 2 | Volvo | Mr Johnson |
| 2016-02-16 22:25:02 | Lev2 | 3 | Volvo | Mr Johnson |
| 2016-02-16 22:30:01 | Lev2 | 3 | Volvo | Mr Johnson |
| 2016-02-17 00:30:01 | Lev1 | 3 | GM | Mr Johnson |
| 2016-02-17 00:35:02 | Lev1 | 3 | GM | Mr Johnson |
假设pos是停车位,posidx是停车位号。 我需要在时间轴上为车主和他的每辆车报告,这应该是这样的:
+---------------------+---------------------+------+--------+-------+------------+
| min(ts) | max(ts) | pos | posidx | car | carowner |
+---------------------+---------------------+------+--------+-------+------------+
| 2016-02-16 20:15:02 | 2016-02-16 20:30:01 | Lev2 | 3 | Volvo | Mr Johnson |
| 2016-02-16 20:35:01 | 2016-02-16 22:20:01 | Lev2 | 2 | Volvo | Mr Johnson |
| 2016-02-16 22:25:02 | 2016-02-17 00:25:01 | Lev2 | 3 | Volvo | Mr Johnson |
| 2016-02-17 00:30:01 | 2016-02-17 00:35:02 | Lev1 | 3 | GM | Mr Johnson |
我试过了:
SELECT min(ts), max(ts), pos, posidx, car, carowner
from parking
where carowner = 'Mr Johnson'
group by pos, posidx, car
但由于posidx分组,它没有显示上述报告的第3行,并在第一行显示其最大值。
你能帮助我吗?
答案 0 :(得分:2)
您需要分配分组标识符。想到这一点的一种方法是它是一个计数器,当某些值改变时递增。有了这个概念,您可以使用变量来分配分组,然后进行聚合:
select min(ts), max(ts), pos, posidx, car, carowner
from (select t.*,
(@grp := if(@pcc = concat_ws(':', posidx, car, carowner), @grp,
if(@pcc := concat_ws(':', posidx, car, carowner), @grp+1, @grp+1)
)
) grp
from t cross join
(select @pcc := '', @grp := 0) params
order by ts
) t
group by pos, posidx, car, carowner, grp;
答案 1 :(得分:0)
除了ts列之外,行1,2,5,6完全相同。查询将仅显示这4行中的MIN和MAX值。从逻辑上讲,它无法分辨哪个EXIT行对应哪个ENTER行。要成功检索所需结果,应该有另一列来标识时间轴行对。