使用mysql计算车辆在客户处的进出时间,为每个客户计算多个站点和条目
我有一个mysql表,其中包含如下截图所示的数据 我的需求是生成一个mysql查询,该查询将显示每个客户的进出时间。 我遇到的问题是,我不能使用min或max,因为车辆可能在一段时间内访问了同一客户两三次 所以我想要的结果是:使用mysql计算车辆在客户处的进出时间,为每个客户计算多个站点和条目,mysql,max,min,Mysql,Max,Min,我有一个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
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,作为将下一条记录选择到结果集中进行比较的基础 根据您的示例,每个客户的结果将是(所有这些车辆都是相同的,因此不会重复该列的显示) 地址GroupSeq 胡拉明1 SACD 2 UL 3 NP 4 胡拉明5 SACD 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
现在,上面的示例实际上并没有计算每次输入输出所花费的总时间,也没有计算每辆车/客户的平均处理时间,但您可以在理解并获得这部分内容后添加这些计算
请注意,这是基于按日期/时间显示的自然顺序。看起来,一笔交易从头到尾可能有许多“输入”,但在进入下一个客户地址之前,总是以“输出”结束。如果这是一个不正确的假设,显然需要进行修改。也许你应该在感谢Drapp上问这个问题,非常感谢你为这个答案所做的努力。我需要一些时间来消化它,并从中吸取教训,所以到时候会有反馈。再次非常感谢,我不知道从哪里开始。把@variables想象成一个内联程序。:=是赋值,结果存储在该行的最后一列中,但在下一个循环中保留它们的值。因此,很像一个按顺序排列的值循环,它们每行都有标记。在外部查询之前单独运行内部查询以查看所有值。然后,应用到外部查询以查看最终结果。再次感谢DRapp,感谢您的时间。我一定会实践这一点。干杯,@RyanSmith,如果你想看到一个真正能让你头疼的。。。查看指向此S/O线程的链接,其中一个看起来很简单:-)我将从录制这一个开始,然后再录制那一个。