我有一个包含数据的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在相应的输出时间和报告之前采取最小的时间?
非常感谢你的帮助。
答案 0 :(得分:1)
您可以使用SQL变量来帮助控制地址何时更改,即使它们多次出现也是如此。如果没有MySQL随时可用,我会接近下面的内容。从内部查询开始,该查询根据车辆和/或地址的变化标记“GroupSeq”。按日期/时间顺序保持订单。在针对@lastGroup的每个测试要么单独留下,要么将1加到序列中之后,那么更新@lastAddress和@lastVehicle作为选择到结果集中的NEXT记录的基础进行比较。
根据您的示例,每个客户的结果将是(所有这些相同的车辆,因此不重复该列的显示) 地址GroupSeq 呼拉明1 SACD 2 UL 3 NP 4 胡拉明5 SACD 6
之后,您可以根据分配的GroupSeq正确执行MIN / MAX。
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”结束。如果这是一个不正确的假设,显然需要进行修改。