使用mysql来计算客户的车辆进出时间,多个站点以及每个客户的条目

时间:2012-03-12 14:08:20

标签: 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

并且根据需要对每个其他站点和车辆都相同。

如何告诉mysql在相应的输出时间和报告之前采取最小的时间?

非常感谢你的帮助。

1 个答案:

答案 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”结束。如果这是一个不正确的假设,显然需要进行修改。