Рассчитать время перекрытия в секундах для групп в SQL - PullRequest
0 голосов
/ 08 мая 2020

У меня есть набор временных меток, сгруппированных по идентификатору, и введите образец данных, показанный ниже.

Я хотел бы найти перекрывающееся время между столбцами start_time и end_time в секундах для каждой группы идентификаторов и между каждым лидом и комбинации последователей. Я хотел бы показать время перекрытия только для первой записи каждой группы, которая всегда будет типа «ведущий».

Например, для идентификатора 1 время начала и окончания последователя в строке 3 перекрывается с временем начала в строке 1 на 193 секунды (с 09:00:00 до 09:03:13). Время ведомого в строке 3 также совпадает с временем лидера в строке 2 на 133 секунды (с 09:01:00 до 07.05.2020 09:03:13). Всего 326 секунд (193 + 133)

Я использовал предложение partition для ранжирования строк по идентификатору и типу и упорядочиванию их по start_time в качестве начала.

Как мне получить перекрытие столбец?

row# ID type      start_time             end_time               rank. overlap
1    1  lead      2020-05-07 09:00:00    2020-05-07 09:03:34       1  326
2    1  lead      2020-05-07 09:01:00    2020-05-07 09:03:13       2  
3    1  follower  2020-05-07 08:59:00    2020-05-07 09:03:13       1
4    2  lead      2020-05-07 11:23:00    2020-05-07 11:33:00       1  540
4    2  follower  2020-05-07 11:27:00    2020-05-07 11:32:00       1
5    3  lead      2020-05-07 14:45:00    2020-05-07 15:00:00       1  305
6    3  follower  2020-05-07 14:44:00    2020-05-07 14:44:45       1    
7    3  follower  2020-05-07 14:50:00    2020-05-07 14:55:05       2

Ответы [ 2 ]

0 голосов
/ 10 мая 2020

Попробовал это двумя способами, и он заработал.

Сначала я объединил 2 таблицы с отдельными записями для каждого типа, «ведущий» и «последователь», и создал оператор case для расчета максимального времени начала для каждой комбинации времени начала интереса и ведомого и минимального времени окончания для каждой комбинации времени окончания интереса и ведомого. Сохраняет это во временной таблице.

CASE
    WHEN lead_table.start_time > follower_table.start_time THEN lead_table.start_time
    WHEN lead_table.start_time < follower_table.start_time THEN patient_table.start_time_local
    ELSE 0
END as overlap_start_time,
CASE
    WHEN follower_table.end_time < lead_table.end_time THEN follower_table.end_time
    WHEN follower_table.end_time > lead_table.end_time THEN  lead_table.end_time
    ELSE 0
END as overlap_end_time

Затем создал внешний запрос для поиска в только что созданной временной таблице, чтобы найти разницу между временем начала и временем окончания для каждой комбинации интереса и последователя в секундах

select temp_table.id,
       temp_table.overlap_start_time,
       temp_table.overlap_end_time,
       DATEDIFF_BIG(second,
            temp_table.overlap_start_time,
            temp_table.overlap_end_time) as overlap_time FROM temp_table
0 голосов
/ 08 мая 2020

В вашем примере время полностью покрывает общую продолжительность. Если это всегда верно, вы можете использовать следующие logi c:

select id,
       (sum(datediff(second, start_time, end_time) -
        datediff(second, min(start_time), max(end_time)
       ) as overlap
from t
group by id;

Чтобы добавить это в качестве дополнительного столбца, затем либо используйте оконные функции, либо join в результате запроса выше.

Если в общем времени есть пробелы, тогда проблема несколько сложнее. Я бы посоветовал вам задать новый вопрос и настроить скрипт db для решения проблемы.

...