Возвращаемое значение из предыдущей записи, если значение равно -1 - PullRequest
0 голосов
/ 03 марта 2011

У меня есть таблица, которая содержит поле LocationId.В некоторых случаях, когда для записи используется один и тот же внешний ключ, LocationId может указываться как -1.

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

Пример данных:

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

Значение -1 должно быть равно 456 для записи 2 и 891 для записи 4 и 5

Ответы [ 4 ]

2 голосов
/ 05 марта 2011

Эта версия оплачивает только поиск, если значение местоположения в текущей строке равно -1.В плане запроса левое объединение содержит предикат сквозного соединения, который пропускает выполнение внутренней стороны объединения, если местоположение <> -1.

;
WITH    CTE
AS      (
        SELECT  *
        FROM    (
                VALUES
                (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', 89),
                (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)
                ) V (record, fk, start_time, end_time, location)
        )
SELECT  T1.record,
        T1.fk,
        T1.start_time,
        T1.end_time,
        CASE WHEN T1.location != -1 THEN Location
        ELSE
            (
            SELECT  TOP (1) 
                    T2.location
            FROM    CTE AS T2
            WHERE   T2.record < T1.record
            AND     T2.fk = T1.fk
            AND     T2.location != -1
            ORDER   BY T2.Record DESC
            )
        END
FROM    CTE AS T1
;
2 голосов
/ 03 марта 2011

Для всего набора результатов

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
1 голос
/ 03 марта 2011
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
1 голос
/ 03 марта 2011

Вы можете использовать коррелированный подзапрос.Например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...