我有一个mysql表,其中包含如下屏幕截图所示的数据。
我的要求是生成一个mysql查询,显示每个客户的进出时间。我遇到的问题是,我不能使用min或max,因为车辆可能在一段时间内访问了同一客户两三次。
所以我想要的输出是:
Vehicle: RB10
Customer: Hulamin
In: 10:19
out: 10:35
Time Taken: 16 min
In: 11:14
out: 11:29
Time Taken: 15 min
ave time taken: 15.5 min
并且根据需要对每个其他站点和车辆也是如此。
我如何告诉mysql在相应的超时之前取最小的时间并报告?
非常感谢您的帮助。
您可以使用SQL变量来帮助控制地址何时更改,即使这些更改发生多次。如果没有现成的MySQL,我会采用如下方法。从一个内部查询开始,该查询根据车辆和/或地址的变化标记"GroupSeq"。按日期/时间顺序排列订单。在针对@lastGroup的每个测试单独进行或在序列中添加1后,然后更新@lastAddress和@lastVehicle,作为将NEXT记录选择到结果集中进行比较的基础。
根据您的示例,每个客户的结果将是(所有这些都是相同的车辆,因此不会重复该列的显示)地址组序列胡拉明1SACD 2UL 3NP 4胡拉明5SACD 6
之后,您可以根据指定的GroupSeq正确执行最小值/最大值。
select
PreQuery.Vehicle,
PreQuery.Address,
PreQuery.GroupSeq,
MIN( PreQuery.`DateTime` ) as InTime,
MAX( PreQuery.`DateTime` ) as OutTime
from
( select
YT.Vehicle,
YT.Address,
YT.`DateTime`,
YT.Direction,
@lastGroup := @lastGroup + if( @lastAddress = YT.Address
AND @lastVehicle = YT.Vehicle, 0, 1 ) as GroupSeq,
@lastVehicle := YT.Vehicle as justVarVehicleChange,
@lastAddress := YT.Address as justVarAddressChange
from
YourTable YT,
( select @lastVehicle := '',
@lastAddress := '',
@lastGroup := 0 ) SQLVars
order by
YT.`DateTime` ) PreQuery
Group By
PreQuery.Vehicle,
PreQuery.Address,
PreQuery.GroupSeq
以上应该会产生类似的结果
Vehicle Address GroupSeq InTime OutTime
RB10 Hulamin 1 10:19 10:35
RB10 SACD 2 10:37 10:40
RB10 UL 3 10:41 11:06
RB10 NP 4 11:07 11:14
RB10 Hulamin 5 11:14 11:28
RB10 SACD 6 11:29 12:21
现在,上面的示例实际上并没有计算每次进出所花费的总时间,也没有计算每辆车/客户的平均处理时间,但您可以在理解并获得这一部分后添加这些计算。
请注意,这是基于按日期/时间显示的自然顺序。看起来一个事务从开始到结束可以有许多"IN",但在转到下一个客户地址之前总是以"OUT"结束。如果这是一个错误的假设,显然需要进行修改。