Я столкнулся с проблемой объединения двух таблиц с интервалом дат, которые представляют изменение статуса пользователя. Идентификатор одинаков в обеих таблицах.
Table_A
ID StatusA FromA ToA
1 Active 01/01/2020 10:00 01/01/2020 11:30
1 NonActive 02/01/2020 09:00 03/01/2020 11:00
2 Active 01/01/2020 10:00 01/01/2020 11:30
3 Active 02/01/2020 09:30 02/01/2020 15:50
Table_B
ID StatusB FromB ToB
1 Chatting 01/01/2020 10:02 01/01/2020 10:15
1 Calling 01/01/2020 10:10 01/01/2020 10:20
2 Awaiting 02/01/2020 10:00 02/01/2020 10:15
2 Calling 02/01/2020 10:16 02/01/2020 10:20
3 Awating 02/01/2020 09:30 02/01/2020 15:50
1 Awating 02/01/2020 09:00 03/01/2020 11:00
Я пытаюсь получить такую таблицу:
ID StatusA FromA ToA StatusB FromB ToB
1 Active 01/01/2020 10:00 01/01/2020 11:30 Chatting 01/01/2020 10:02 01/01/2020 10:15
1 Active 01/01/2020 10:00 01/01/2020 11:30 Calling 01/01/2020 10:10 01/01/2020 10:20
2 Active 01/01/2020 10:00 01/01/2020 11:30 Awaiting 02/01/2020 10:00 02/01/2020 10:15
2 Active 01/01/2020 10:00 01/01/2020 11:30 Calling 02/01/2020 10:16 02/01/2020 10:20
Запрос, который я написал в самом начале:
SELECT Table_A.ID,
Table_A.StatusA AS "Primary_Status",
Table_A.FromA,
Table_A.ToA,
Table_B.StatusB AS "Secondary_Status",
Table_B.FromB,
Table_B.ToB,
FROM TableA
INNER JOIN Table_B ON Table_A.ID = Table_B.ID
WHERE ((Table_B.startTime BETWEEN Table_A.FromA AND Table_A.ToA)
or (Table_B.FromB <= Table_A.FromA AND Table_B.ToB <= Table_A.ToA)
or (Table_B.FromB <= Table_A.FromA AND Table_B.ToB >= Table_A.ToA)
or (Table_B.FromB BETWEEN Table_A.FromA AND Table_A.ToA AND Table_B.ToB >= Table_A.ToA)
);
Заранее спасибо!
РЕДАКТИРОВАТЬ: каждый идентификатор уникально идентифицирует пользователя. Итак, пользователь с ID = 1 в Table_A - это тот же пользователь с ID = 1 в Table_B
EDIT_02: Благодаря решению Гордона Линоффа у меня теперь
SELECT Table_A.ID,
Table_A.StatusA AS "Primary_Status",
Table_A.FromA,
Table_A.ToA,
Table_B.StatusB AS "Secondary_Status",
Table_B.FromB,
Table_B.ToB,
FROM TableA
INNER JOIN Table_B ON (Table_A.ID = Table_B.ID AND Table_B.FromB >= Table_A.FromA AND Table_B.ToB <= Table_A.ToA)
Этот запрос работает, но я мог бы иметь ситуацию, что
b.FromB <= a.FromA && b.ToB <= a.ToA
b.FromB >= a.FromA && b.ToB >= a.ToA
b.FromB <= a.FromA && b.ToB >= a.ToA