Как я могу отслеживать последнее местоположение отгрузки, эффективно, используя последнюю дату отчетности?
-
24-09-2019 - |
Вопрос
Мне нужно найти последнее местоположение каждого грузового предмета в консигнации. Мы в основном делаем это, посмотрев на маршрут, выбранный для отправки, а затем нахождение последнего (максимального) времени, введенного против узлов этого маршрута. Например, если маршрут имеет 5 узлов, и мы ввели время против первых 3 узлов, то последнее время (MAX Time) расскажет нам свое местоположение между 3 узлами.
Я действительно застрял на этом запросе в отношении вопросов производительности. Даже на несколько сотен рядов, это занимает более 2 минут. Пожалуйста, предложите, как я могу улучшить этот запрос или любой альтернативный подход, который я должен приобрести?
Примечание: ATA = Фактическое время прибытия и ATD = Фактическое время отправления
SELECT DISTINCT
c.id as cid
, c.ref as cons_ref
, c.Name
, c.CustRef
FROM consignments c
INNER JOIN routes r ON c.Route = r.ID
INNER JOIN routes_nodes rn ON rn.Route = r.ID
INNER JOIN cargo_timing ct ON c.ID=ct.ConsignmentID
INNER JOIN ( SELECT t.ConsignmentID, Max(t.firstata) as MaxDate
FROM cargo_timing t
GROUP BY t.ConsignmentID
) as TMax
ON ( TMax.MaxDate=ct.firstata
AND TMax.ConsignmentID=c.ID
)
INNER JOIN nodes an ON ct.routenodeid = an.ID
INNER JOIN contract cor ON cor.ID = c.Contract
WHERE c.Type = 'Road'
AND ( c.ATD = 0 AND c.ATA != 0 )
AND (cor.contract_reference in ('Generic','BP001','020-543-912'))
ORDER BY c.ref ASC
Решение
Можете ли вы назначить каждый узел идентификатор и добавить этот идентификатор в таблицу consignments
Как внешний ключ? Это позволило бы вам установить «текущий» узел, когда груз пропускает через узел. Разница в среден раз и последнее обновление поля «текущего узла» в consignments
Таблица тогда даст вам представление о том, как за груз попал на маршрут.