Используйте mysql для определения времени прибытия и выхода автомобиля у клиента, нескольких остановок и записей для каждого клиента - PullRequest
0 голосов
/ 12 марта 2012

У меня есть таблица MySQL, которая содержит данные, как показано на скриншоте ниже.

Мое требование - сгенерировать запрос mysql, который покажет время входа и выхода для каждого клиента. у меня проблема в том, что я не могу использовать минимальное или максимальное значение, поскольку транспортное средство могло посещать одного и того же клиента два или три раза в течение периода.

Итак, вывод, который я ищу:

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 Ответ

1 голос
/ 12 марта 2012

Вы можете сделать это, используя переменные SQL, чтобы помочь контролировать изменения адреса, даже если они происходят несколько раз.Не имея MySQL в свободном доступе, я бы подошел к чему-то похожему ниже.Начните с внутреннего запроса, который помечает «GroupSeq» на основании изменения либо транспортного средства, либо адреса.Сохраняйте порядок по дате / времени.После того, как каждый тест против @lastGroup либо оставлен один, либо добавлен 1 к последовательности, ТО обновляет @lastAddress и @lastVehicle в качестве основы для выбора СЛЕДУЮЩЕЙ записи в наборе результатов для сравнения.

Для каждогоНапример, результаты каждого клиента будут (все эти же транспортные средства, поэтому не дублируя отображение этого столбца) Адрес GroupSeq Hulamin 1 SACD 2 UL 3 NP 4 Hulamin 5 SACD 6

После этого вы можете затем правильносделайте ваш MIN / MAX на основе назначенного 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», прежде чем перейти к следующему адресу клиента.Если это неверное предположение, очевидно, что необходимо внести изменения.

...