Сравните предыдущую строку, используя значения времени

У меня есть этот набор данных

введите здесь описание изображения

Что я хочу сделать, так это сравнить время начала с предыдущей строкой, и если время начала находится между временем начала и окончания предыдущей строки, отметьте его. Является ли этот флаг двоичным или x не имеет значения, его просто нужно посчитать. Таким образом, новый столбец вызывает экземпляры, в которых время начала текущей строки находится между временем начала и окончания предыдущей строки. Мои результаты должны выглядеть так.

введите здесь описание изображения

Я думаю, что здесь нужно использовать LAG и / или LEAD, но я ужасно новичок в обоих из них. Я также думаю, что мне нужно создать ROW() для этого, чтобы он работал. В любом случае, ищу какое-то руководство по этому поводу. Мне нужно иметь возможность отслеживать время разговора, чтобы увидеть, сколько раз человек обрабатывает одновременные разговоры (обычно не более 2).


person misterc625    schedule 21.04.2020    source источник


Ответы (2)


Предполагая, что у вас есть первичный ключ, такой как идентификатор в приведенном ниже примере, вы можете сделать что-то вроде приведенного ниже

         WITH data
         AS (SELECT * FROM YOUR_TABLE),
         d1
         AS (SELECT d.*,
                    Lead(start_date)
                      over (
                        ORDER BY id) lead_start_date
             FROM   data d)
    SELECT id,
           start_date,
           end_date,
           CASE
             WHEN lead_start_date BETWEEN start_date AND end_date THEN 1
             ELSE 0
           END marker
    FROM   d1;
person psaraj12    schedule 21.04.2020

Один из методов exists:

select t.*,
       (case when exists (select 1
                          from t t2
                          where t2.starttime <= t.starttime and
                                t2.endtime >= t.starttime
                         )
             then 1 else 0
        end) as dual_convo
from t;

Если я правильно понимаю, думаю, можно использовать и кумулятивный максимум:

select t.*,
       (case when max(endtime) over (order by starttime, endtime
                                     rows between unbounded preceding and 1 preceding
                                    ) > starttime
             then 1 else 0
        end) as dual_convo
from t;

В ваших данных есть только примеры, в которых предыдущая строка перекрывается. Но, по-видимому, у вас могли быть перекрытия в более ранних строках, например:

1     9
2     3
4     5
8     12

Все, кроме первого, перекрываются, и только первый с «предыдущим» рядом.

person Gordon Linoff    schedule 21.04.2020