Reputation: 4190
I've got a table that contains a LocationId field. In some cases, where a record shares the same foreign key, the LocationId might come through as -1.
What I want to do is in my select query is in the case of this happening, the previous location.
Example data:
Record FK StartTime EndTime Location
1 110 2011/01/01 12.30 2011/01/01 6.10 456
2 110 2011/01/01 3.40 2011/01/01 4.00 -1
3 110 2011/01/02 1.00 2011/01/02 8.00 891
4 110 2011/01/02 5.00 2011/01/02 6.00 -1
5 110 2011/01/02 6.10 2011/01/02 6.30 -1
The -1 should come out as 456 for record 2, and 891 for record 4 and 5
Upvotes: 0
Views: 721
Reputation: 7769
SELECT
Record,
FK,
StartTime,
EndTime,
(
SELECT
Location
FROM
MyTable
WHERE
Record =
(
SELECT
MAX(Record)
FROM
MyTable t2
WHERE
t2.Record =< t1.Record AND
Location >= 0
)
)
FROM
MyTable t1
Upvotes: 1
Reputation: 19329
You can use a correlated subquery. For example:
SELECT *
, (SELECT TOP 1 Location
FROM MyTable T2
WHERE T2.Record <= T1.Record
AND T2.FK = T1.FK
AND T2.Location <> -1
ORDER BY T2.Record DESC) AS BestLocation
FROM MyTable T1
Upvotes: 1
Reputation: 107736
For the entire result set
with tmp(Record ,FK ,StartTime ,EndTime ,Location)
as( select
1, 110 ,'2011/01/01 12:30', '2011/01/01 6:10', 456 union all select
2, 110 ,'2011/01/01 3:40', '2011/01/01 4:00', -1 union all select
3, 110 ,'2011/01/02 1:00', '2011/01/02 8:00', 891 union all select
4, 110 ,'2011/01/02 5:00', '2011/01/02 6:00', -1 union all select
5, 110 ,'2011/01/02 6:10', '2011/01/02 6:30', -1
)
-- ignore above this line
select curr.Record, curr.FK, curr.StartTime, curr.EndTime,
case when curr.Location=-1 then prev.Location else curr.Location end Location
from tmp curr
outer apply
(select top 1 prev.location
from tmp prev
where curr.location=-1 and prev.FK=curr.FK
and prev.starttime < curr.starttime
and prev.location <> -1
order by prev.starttime desc) prev
Upvotes: 2