Улучшение внутреннего соединения / запроса к временным таблицам - PullRequest
0 голосов
/ 17 марта 2020

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

Я пробовал подходы Inner Joins и FIRST_VALUE, но не получил правильных результатов. поэтому я прибег к временным таблицам (просто потому, что мне легче проверять результаты таким образом).

Проблема в том, что я получаю StartWayPoint и EndWayPoint из dbo.Trips, которые на самом деле являются только первой и последней точками, введенными в Таблица GPSWaypoints (для конкретной поездки / транспортного средства).

Эти точки не введены в порядке UTCTime, поэтому мне нужно взять StartWayPoint, EndWayPoint & Vehicle, получить результаты МЕЖДУ этими значениями путевых точек из таблицы dbo.GPSWaypoints, отсортировать их по UTCTime des c и первому Строка местоположения - это моя настоящая EndLocationString.

Надеюсь, что это имеет смысл, возможно, я усложнил это ... Я чувствую, что ответ - либо Внутреннее соединение, либо SubQuery, мои навыки SQL радуют Не так жарко, хотя любая помощь приветствуется.

DROP TABLE IF EXISTS #temp1, #temp2

USE         XXX

DECLARE     @StartWayPoint bigint, @EndWaypoint bigint, @Vehicle smallint, @TripId smallint = 9863;

SELECT      t.Id, 
            t.Date, 
            t.StartWayPoint, 
            t.EndWayPoint, 
            t.Distance, 
            t.Alarms, 
            t.FuelConsumption, 
            t.Vehicle, 
            gpsStart.UtcTime as TripStart, 
            gpsEnd.UtcTime as TripEnd, 
            gpsStart.LocationString as StartLocationString, 
            gpsEnd.LocationString as EndLocationString
INTO        #temp1
FROM        dbo.Trips t 
LEFT JOIN   dbo.GPSWaypoints gpsStart on StartWaypoint = gpsStart.Id 
LEFT JOIN   dbo.GPSWaypoints gpsEnd on EndWaypoint = gpsEnd.Id 
LEFT JOIN   dbo.Operators o on Driver = o.Id 
LEFT JOIN   dbo.Vehicles v on t.Vehicle = v.Id 
WHERE       t.id = @TripId


SELECT      @StartWayPoint = (SELECT StartWaypoint FROM #temp1), @EndWaypoint = (SELECT EndWaypoint FROM #temp1), @Vehicle = (SELECT Vehicle FROM #temp1)

SELECT TOP 1 g.Id, 
            g.LocationString, 
            g.Vehicle
INTO        #temp2
FROM        dbo.GPSWaypoints g
WHERE       Id BETWEEN @StartWayPoint AND @EndWaypoint 
AND         Vehicle = @Vehicle 
order by    UtcTime desc

SELECT      t1.*,
            t2.Id as TRUE_EndWayPoint,
            t2.LocationString as TRUE_EndLocationString
FROM        #temp1 t1
LEFT JOIN   #temp2 t2 on t2.Vehicle = t1.

Результаты # temp1

Results from #temp1

Результаты # temp2 (с TRUE EndWayPoint и EndLocationString

Results from #temp2 (with TRUE EndWayPoint and EndLocationString

1 Ответ

1 голос
/ 17 марта 2020

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

select  t.Id, 
        t.Date, 
        t.StartWayPoint, 
        t.EndWayPoint, 
        t.Distance, 
        t.Alarms, 
        t.FuelConsumption,      
        t.Vehicle,          
        gpsStart.UtcTime as TripStart, 
        gpsEnd.UtcTime as TripEnd, 
        gpsStart.LocationString as StartLocationString, 
        (   select top 1 (g.LocationString) 
            from dbo.GPSWaypoints g 
            where Id BETWEEN gpsStart.Id AND gpsEnd.Id 
            AND Vehicle = v.Id 
            order by UtcTime desc
        ) as EndLocationString
from    dbo.Trips t 
left join dbo.GPSWaypoints gpsStart on StartWaypoint = gpsStart.Id 
left join dbo.GPSWaypoints gpsEnd on EndWaypoint = gpsEnd.Id 
left join dbo.Operators o on Driver = o.Id 
left join dbo.Vehicles v on t.Vehicle = v.Id 
where   t.id = 9863
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...