Вы можете использовать функцию Row_Number для нумерации каждой даты начала в каждом TripID. Кроме того, я инкапсулировал запрос в выражении общей таблицы, чтобы затем использовать его только для тех поездок, где их нумерация строк была равна 1, что будет представлять самую раннюю дату, если поездка возвратит несколько строк.
With TripInfo As
(
Select TInfo.RecordID As TripID
, TInfo.TripDate
, Origin.LocationName As Origin
, TInfo.OriginDepartureTime As StartDateTime
, TInfo.OriginReturnTime As ReturnDateTime
, Coalesce( TInfo.NoOfStudents, 0 ) As NumberOfStudents
, Coalesce( TInfo.NoOfAdults, 0) As NumberOfAdults
, Coalesce( TInfo.NoOfStudents, 0) + Coalesce(TInfo.NoOfAdults, 0) As NumberOfPassengers
, Dest.LocationName As Destination
, V.Vehicle
, Driver.LastName + ', ' + Driver.FirstName As Driver
, Row_Number() Over ( Partition By TInfo.RecordId
Order By TInfo.OriginDepartureTime ) As TripDateRnk
From dbo.Trip_TripInformation As TInfo
Left Join dbo.Trip_Location AS Origin
On Origin.RecordID = TInfo.OriginLocationID
Left Join dbo.Trip_TripDestinations As TDest
On TInfo.RecordID = TDest.TripID
Left Join dbo.Trip_Location AS Destination
On Destination.RecordID = TDest.LocationID
Left Join dbo.Trip_TripDriverVehicle As TripV
On TInfo.RecordID = TripV.TripID
And TripV.DestinationID = TDest.RecordID
Left Join dbo.Vehicles As V
ON dbo.Vehicles.RecordID = TripV.VehicleID
Left Join dbo.Employees AS Driver
On dbo.Trip_TripDriverVehicle.DriverID = Driver.RecordID
)
Select TripID, TripDate, Origin, StartDateTime, ReturnDateTime
, NumberOfStudents, NumberOfAdults, NumberOfPassengers
, Destination, Vehicle, Driver
From TripInfo
Where TripDateRank = 1
Order By TripID
Пара других наблюдений:
Я заметил, что каждая таблица использует левое соединение. Действительно ли так, что все рассматриваемые столбцы обнуляются? Например, действительно ли так, что столбцы VehicleID и DriverID в таблице Trip_TripDriverVehicle обнуляются? Вы можете обозначить водителя транспортного средства без транспортного средства и без водителя?
Я бы рекомендовал использовать функцию Coalesce
вместо ужасно названной специфичной для SQL Server функции IsNull
. Они работают примерно так же, но Coalesce является стандартным и допускает более двух параметров, тогда как IsNull
ограничен двумя. Это не будет иметь существенного значения в отношении вашего кода или производительности. Это просто улучшение стиля.