Сравните предыдущую строку, используя значения времени - PullRequest
0 голосов
/ 21 апреля 2020

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

enter image description here

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

enter image description here

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

Ответы [ 2 ]

0 голосов
/ 21 апреля 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

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

0 голосов
/ 21 апреля 2020

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

         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;
...