DB2 присоединяется к случаю, когда и ближайшая временная метка - PullRequest
1 голос
/ 24 сентября 2019

Я пытаюсь выяснить, как лучше в DB2 использовать объединение и «случай, когда» на основе ближайшей отметки времени другой таблицы.У меня есть основной запрос на активность событий:

SELECT eventActivity, eventUser, eventTimestamp
            FROM eventActivities
            WHERE id = 123;

И второй запрос с соответствующими кодами состояния

SELECT * from eventStatus where event_id = 123;

Первый запрос возвращает

eventActivity   |   eventUser   |   eventTimestamp
----------------------------------------------------------------
Status Change       John            2019-09-17 00:00:07.541854
Status Change       John            2019-09-17 00:00:09.235154
Event Closed        John            2019-09-17 00:00:10.000000

2-е возвращение

event_id   |   event_status   |   timestamp
--------------------------------------------------------------
123             Progress            2019-09-17 00:00:07.541921
123             Cancelled           2019-09-17 00:00:09.340911

Я хотел бы сделать так, чтобы я мог присоединиться к первому запросу, и только если действие «Изменение состояния», получит event_status с ближайшей отметкой времени, еслиэто имеет смысл.

Таким образом, мой желаемый вывод для вышеупомянутого будет примерно таким:

SELECT eventActivity, eventUser, eventTimestamp, case when eventActivity = 'Status Change' select event_status from eventStatus where event_id = 123 with nearest timestamp
FROM eventActivities
WHERE id = 123;

eventActivity   |   eventUser   |   event_timestamp            |   event_status
--------------------------------------------------------------------------------------
Status Change       John            2019-09-17 00:00:07.541854    Progress
Status Change       John            2019-09-17 00:00:09.235154    Cancelled
Event Closed        John            2019-09-17 00:00:10.000000    null

Есть ли способ, которым я могу вполне реально сделать это в db2?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

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

SELECT ea.eventActivity, ea.eventUser, ea.eventTimestamp,
       (SELECT es.status
        FROM eventstatus es
        WHERE es.event_id = ea.id AND
              ea.eventActivity = 'Status Change' AND
              es.timestamp <= ea.eventtimestamp
        ORDER BY es.timestamp DESC
        FETCH FIRST 1 ROW ONLY
       ) as status
FROM eventActivities ea
WHERE ea.id = 123; 
0 голосов
/ 24 сентября 2019

Попробуйте:

SELECT a.eventActivity, a.eventUser, a.eventTimestamp, s.event_status
FROM eventActivities a
LEFT JOIN TABLE
(
SELECT s.event_status
FROM eventStatus s
WHERE s.event_id = a.id
ORDER BY abs(timestampdiff(1, char(a.eventTimestamp - s.timestamp)))
FETCH FIRST 1 ROW ONLY
) s ON a.eventActivity = 'Status Change'
WHERE a.id = 123
;

Ближайшее значение eventStatus.timestamp может быть больше или меньше eventActivities.eventTimestamp.Это не имеет значения для оператора select выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...