У меня есть этот запрос, и он возвращает ожидаемые результаты, однако, как вы можете видеть, он действительно груб и труден для чтения.
Я пробовал подходы 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
Результаты # temp2 (с TRUE EndWayPoint и EndLocationString