MySQL在时间线

时间:2016-02-17 10:46:09

标签: mysql sql

是否可以根据时间线获得最小和最大时间戳?我将在停车示例中解释它。

+---------------------+------+--------+-------+------------+
| 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行,并在第一行显示其最大值。

你能帮助我吗?

2 个答案:

答案 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行。要成功检索所需结果,应该有另一列来标识时间轴行对。