Я уже неделю пытаюсь найти решение следующей загадки Redshift (думаю, я стал одержим ею):
В Redshift есть таблица событий («event_user_item»), в которой пользователи запускают события для определенных элементов, вводя код элемента, который отображается в столбце event_value.
Неудачная отправка состоит из последовательности event_type PageLoad-ItemCode-ErrorResponse, но такие типы событий не обязательно являются последовательными, что означает, что между каждым из них может быть ряд других типов событий за ID пользователя.
Я публикую небольшой отрывок, основанный на 3 разных идентификаторах user_id, который должен иллюстрировать соответствующие сценарии с упором на неудавшиеся отправления.
ord_num event_type event_value user_id event_datetime
1 PageLoad 124 03/09/2018 21:48:39
2 ItemCode LG56731 124 03/09/2018 21:48:53
4 Details1PageLoad 124 03/09/2018 21:48:56
8 PageLoad 124 03/09/2018 22:02:23
9 ItemCode GU07019 124 03/09/2018 22:02:32
10 ErrorResponse Some message 124 03/09/2018 22:02:32
51 PageLoad 228 04/09/2018 12:38:30
52 ItemCode EQ23487 228 04/09/2018 12:38:33
53 ErrorResponse Some message 228 04/09/2018 12:38:34
54 PageLoad 304 04/09/2018 15:43:14
55 ItemCode OB68102 304 04/09/2018 15:43:57
56 ErrorResponse Some message 304 04/09/2018 15:43:58
57 ItemCode PB68102 304 04/09/2018 15:44:21
58 ErrorResponse Some message 304 04/09/2018 15:44:22
59 PageLoad 304 05/09/2018 11:19:37
60 ItemCode OB68102 304 05/09/2018 11:20:17
62 Details1PageLoad 304 05/09/2018 11:20:20
ЗАДАЧА: найти количество неудачных отправок на user_id на ItemCode. Важно не путать коды элементов из Неудачных и успешных отправок. Кроме того, с одним и тем же кодом элемента может быть несколько записей об ошибке.
Я не эксперт в Redshift, особенно в его оконных функциях, но первой идеей, которую я пытался придерживаться, была функция LAG. Для этого я намеревался идентифицировать последовательности ord_nums, которые можно было бы считать, например
ord_num event_type event_value user_id event_datetime error? sequence
1 PageLoad 124 03/09/2018 21:48:39
2 ItemCode LG56731 124 03/09/2018 21:48:53
4 Details1PageLoad 124 03/09/2018 21:48:56
8 PageLoad 124 03/09/2018 22:02:23
9 ItemCode GU07019 124 03/09/2018 22:02:32
10 ErrorResponse Some message 124 03/09/2018 22:02:32 1 8-9-10
51 PageLoad 228 04/09/2018 12:38:30
52 ItemCode EQ23487 228 04/09/2018 12:38:33
53 ErrorResponse Some message 228 04/09/2018 12:38:34 1 51-52-53
54 PageLoad 304 04/09/2018 15:43:14
55 ItemCode OB68102 304 04/09/2018 15:43:57
56 ErrorResponse Some message 304 04/09/2018 15:43:58 1 54-55-56
57 ItemCode PB68102 304 04/09/2018 15:44:21
58 ErrorResponse Some message 304 04/09/2018 15:44:22 1 54-57-58
59 PageLoad 304 05/09/2018 11:19:37
60 ItemCode OB68102 304 05/09/2018 11:20:17
62 Details1PageLoad 304 05/09/2018 11:20:20
Таким образом, по user_id должно быть следующее количество:
user_id nr_failed_submissions
124 1
228 1
304 2
Однако, как видно из приведенного выше набора данных и ожидаемого результата, невозможно предсказать, сколько записей нужно переместить назад, мне нужно дополнительное условие, которое нельзя поместить в LAG ...
Я перепробовал много вариантов, но ни один из них не подошел.
Были опубликованы очень полезные и содержательные посты.
- функция задержки для получения последнего другого значения (красного смещения),
- Последнее ненулевое значение в Redshift по группам
- Как получить Redshift / Postgresql LAG оконная функция для выборочного исключения записей?
- Назначьте последовательность ( идентификатор сеанса) в мою таблицу на основе значения A в поле
но до сих пор мне не удалось объединить их все в решение, которое бы работало. Должен быть способ сделать это в Redshift?