Оценка последовательных дат при заданном условии - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть запрос, который очень просто выглядит так:

SELECT
event_date,
client_id,
error_id
FROM
table.name

Это не фактический запрос, но ради простоты и наличия чего-то воспроизводимого, он дает нам то, что нам нужно. Это производит вывод как это:

event_date   client_id   error_id
2018-09-01   12345       232 send failure
2018-09-02   12345       232 send failure
2018-09-03   12345       232 send failure
2018-09-05   12345       232 send failure
2018-09-01   12345       508 server failure
2018-09-02   12345       615 script break
2018-09-01   67890       232 send failure
2018-09-02   67890       232 send failure
2018-09-03   67890       404 load failure
2018-09-01   67890       508 server failure
2018-09-02   67890       615 script break

Что я хочу сделать, так это создать еще один столбец, который будет "помечаться", если идентификатор клиента видит эту ошибку в последовательные дни. Итак, скажем, в первый раз, когда идентификатор клиента # 12345 видит, 232 send failure равен 2018-09-01. В 2018-09-02 (или в любую последующую последовательную дату, когда появляется эта ошибка, она будет помечена. Поэтому ошибка в 2018-09-05, несмотря на то, что это та же ошибка для того же идентификатора клиента, не будет помечена, потому что ее не было в 2018-09-04. Итак, мой идеальный вывод будет выглядеть так:

event_date   client_id   error_id            flag
2018-09-01   12345       232 send failure    No
2018-09-02   12345       232 send failure    Yes
2018-09-03   12345       232 send failure    Yes
2018-09-05   12345       232 send failure    No
2018-09-01   12345       508 server failure  No
2018-09-02   12345       615 script break    No
2018-09-01   67890       232 send failure    No
2018-09-02   67890       232 send failure    Yes
2018-09-03   67890       404 load failure.   No
2018-09-01   67890       508 server failure  No
2018-09-02   67890       615 script break    Yes

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Я бы просто использовал lag() и case:

select t.*,
       (case when lag(error_id) over (partition by client_id order by date) = error_id and
                  lag(date) over (partition by client_id order by date) = dateadd(day, -1, date)
             then 'yes' else 'no'
        end) as flag_consecutive_dates
from t;
0 голосов
/ 06 сентября 2018

Для того, чтобы сделать это, вам необходимо самостоятельно объединить этот набор таблиц / результатов с собственной датой + 1 день с левым соединением (все остальные столбцы совпадают).

Затем можно использовать оператор case, чтобы получить флаг yes / no на основе того, соответствует ли соединение чему-либо (здесь достаточно проверки для любого столбца).

SELECT event_date, client_id, error_id,
       case when b.event_date is not null then 'Yes' else 'No' end as flag
FROM table.name a
left join table.name b
on dateadd(day,1,a.event_date) = b.event_date and
   a.client_id = b.client_id and
   a.error_id = b.error_id

Левое объединение будет включать в себя все в вашей таблице и даст вам столбцы на любую дату + 1 (или ноль, если ее нет).

Я не пользователь с красным смещением, но похоже, что функция добавления даты, указанная выше, должна работать на основе этого: https://docs.aws.amazon.com/redshift/latest/dg/r_DATEADD_function.html.

...