SQL - получить значение из следующей строки на основе определенного условия - PullRequest
0 голосов
/ 16 мая 2019

У меня есть следующая таблица:

| ID | Ref | Type |              LogTime |
|----|-----|------|----------------------|
|  1 |  AA |    1 | 2019-05-03 18:30:01  |
|  2 |  BB |    1 | 2019-05-03 19:42:02  |
|  3 |  AA |    3 | 2019-05-04 12:30:03  |
|  4 |  BB |    3 | 2019-05-05 19:42:04  |
|  5 |  AA |    1 | 2019-05-06 20:55:05  |

Я хотел бы перечислить все строки с Type = 1 и включить значение LogTime, где значения Ref равны и Type = 3

Примерно так:

| ID | Ref | Type |              LogTime |        LogTime_Type3 |
|----|-----|------|----------------------|----------------------|
|  1 |  AA |    1 | 2019-05-03 18:30:01  | 2019-05-04 12:30:03  |
|  2 |  BB |    1 | 2019-05-03 19:42:02  | 2019-05-05 19:42:04  |
|  5 |  AA |    1 | 2019-05-06 20:55:05  | NULL                 |

Я пытался использовать LEAD(LogTime) Over.., но мне не удалось указать записи с типом = 3

Не могли бы вы помочь.

Вот мой SqlFiddle

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Вы можете просто использовать join:

SELECT t.*, t3.LogTime as LogTime3
FROM Trans t LEFT JOIN
     Trans t3
     ON t3.ref = t.ref and t3.TYPE = '3'
WHERE t.TYPE = '1'
ORDER BY t.id;

Один из способов получить следующее время - использовать OUTER APPLY:

SELECT t.*, t3.LogTime as LogTime3
FROM Trans t OUTER APPLY
     (SELECT TOP (1) t3.*
      FROM Trans t3
      WHERE t3.ref = t.ref and
            t3.LogTime > t.LogTime and
            t3.TYPE = '3'
      ORDER BY t.LogTime ASC
     ) t3
WHERE t.TYPE = '1'
ORDER BY t.id;

Или, используя оконные функции, кумулятивный минимум кажется наиболее подходящим:

SELECT t.*
FROM (SELECT t.*,
             MIN(CASE WHEN t.TYPE = '3' THEN t.LogTime END) OVER (PARTITION BY ref ORDER BY LogTime DESC) as LogTime3
      FROM Trans t 
     ) t
WHERE t.TYPE = '1'
ORDER BY t.id;
0 голосов
/ 16 мая 2019

Используя подзапрос, мы также можем достичь ожидаемого результата

SELECT DISTINCT
     O.ID,
     O.Ref,
     O.[Type],
     O.LogTime,
    (SELECT TOP 1 I.LogTime FROM LoginLogout I
     WHERE I.Ref = O.Ref
        AND I.[Type] = 3 
        AND I.LogTime > O.LogTime) AS LogTime_Type3 
FROM LoginLogout O
WHERE O.[Type] = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...