SQL - агрегирует данные с интервалом дат - PullRequest
0 голосов
/ 03 марта 2020

Я столкнулся с проблемой объединения двух таблиц с интервалом дат, которые представляют изменение статуса пользователя. Идентификатор одинаков в обеих таблицах.

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

1 Ответ

2 голосов
/ 03 марта 2020

Вы, похоже, просто хотите join с правильными условиями в столбцах времени:

SELECT a.ID, a.StatusA AS "Primary_Status", a.FromA, a.ToA,
       b.StatusB AS "Secondary_Status", b.FromB, b.ToB,
FROM TableA a JOIN
     Table_B b
     ON a.ID = b.ID AND
        b.FromB >= a.FromA AND
        b.ToB <= b.FromB;
...