Reputation: 68
I am maintaining history of operations on vehicles in a table and now I want to get few fields of the latest operation on each of the vehicle.
This is what I tried
SELECT HVeh.RefVehicleModel , HVeh.RefVehStatus , HVeh.ChangedDate
FROM HVeh
WHERE ChangedDate >= @X AND ChangedDate <= @Y
order by HVeh.RefVehicleModel, HVeh.ChangedDate DESC
and it returns
The above query returns me something as given below
X 1 2019-09-04 08:21:39.223
X 1 2019-09-03 13:47:48.943
X 1 2019-09-03 11:27:43.813
X 1 2019-09-03 10:57:12.080
however, I want to select only the top row now as it is the most latest entry and is of particular interest.
NOTE : If I use SELECT TOP 1, it only fetches top row of the whole returned table, however I have multiple entries(for each vehicle) as I said, I need "top" entry for each of them
Upvotes: 0
Views: 79
Reputation: 1522
SELECT HVeh.RefVehicleModel , HVeh.RefVehStatus , HVeh.ChangedDate
FROM HVeh
WHERE
convert(DATETIME,ChangedDate)
BETWEEN Convert(DATETIME,CASE WHEN isnull(@X,'')='' THEN ChangedDate ELSE isnull(@X,'') END)
AND Convert(DATETIME, CASE WHEN isnull(@Y,'')='' THEN ChangedDate ELSE isnull(@Y,'') END)
order by HVeh.RefVehicleModel, CONVERT(DATETIME,HVeh.ChangedDate,106) DESC
I think this query will perfect for you....
Note:- @X as FromDate and @Y as ToDate
Upvotes: -1
Reputation: 522787
Is this what you want?
SELECT TOP 1 WITH TIES HVeh.RefVehicleModel, HVeh.RefVehStatus, HVeh.ChangedDate
FROM HVeh
WHERE ChangedDate >= @X AND ChangedDate <= @Y
ORDER BY ROW_NUMBER() OVER (PARTITION BY HVeh.RefVehicleModel ORDER BY HVeh.ChangedDate DESC);
Upvotes: 2
Reputation: 1271171
If you want the latest record for each vehicle model, then use a correlated subquery or window functions:
SELECT RefVehicleModel, RefVehStatus, ChangedDate
FROM (SELECT HVeh.RefVehicleModel, HVeh.RefVehStatus, HVeh.ChangedDate,
ROW_NUMBER() OVER (PARTITION BY HVeh.RefVehicleModel ORDER BY HVeh.ChangedDate DESC) as seqnum
FROM HVeh
WHERE ChangedDate >= @X AND ChangedDate <= @Y
) h
WHERE seqnum = 1;
If you want only one record, then SELECT TOP (1)
is a good solution.
Upvotes: 1