по времени.
┌────────────────────time─┬─is_chain─┬───────────event_hash─┬
│ 2021-07-26 07:42:30.257 │ 0 │ 3696312325678389301 │
│ 2021-07-26 07:42:34.672 │ 1 │ 6084401719424398292 │
│ 2021-07-26 07:42:38.033 │ 1 │ 16435419841371183696 │
│ 2021-07-26 07:42:41.094 │ 1 │ 17027928113757912089 │
│ 2021-07-26 07:42:44.168 │ 1 │ 12739018415153374561 │
│ 2021-07-26 07:42:46.928 │ 1 │ 12406637112495797940 │
│ 2021-07-26 07:42:49.578 │ 0 │ 3033780203693828475 │
│ 2021-07-26 07:42:52.560 │ 0 │ 5736227406744300673 │
│ 2021-07-26 07:42:56.663 │ 1 │ 1666266680073442384 │
│ 2021-07-26 07:42:59.623 │ 1 │ 13286081543861427944 │
└─────────────────────────┴──────────┴──────────────────────┴─
Если события зависимые, они помечены is_chain == 1. Исходное событие - это is_chain==0 перед зависимым, надо добавить столбец original_hash, в котором хэши исходных событий:
┌────────────────────time─┬─is_chain─┬───────────event_hash─┬────────────orig_hash─┐
│ 2021-07-26 07:42:30.257 │ 0 │ 3696312325678389301 │ 3696312325678389301 │
│ 2021-07-26 07:42:34.672 │ 1 │ 6084401719424398292 │ 3696312325678389301 │
│ 2021-07-26 07:42:38.033 │ 1 │ 16435419841371183696 │ 3696312325678389301 │
│ 2021-07-26 07:42:41.094 │ 1 │ 17027928113757912089 │ 3696312325678389301 │
│ 2021-07-26 07:42:44.168 │ 1 │ 12739018415153374561 │ 3696312325678389301 │
│ 2021-07-26 07:42:46.928 │ 0 │ 12406637112495797940 │ 12406637112495797940 │
│ 2021-07-26 07:42:49.578 │ 0 │ 3033780203693828475 │ 3033780203693828475 │
│ 2021-07-26 07:42:52.560 │ 0 │ 5736227406744300673 │ 5736227406744300673 │
│ 2021-07-26 07:42:56.663 │ 1 │ 1666266680073442384 │ 5736227406744300673 │
│ 2021-07-26 07:42:59.623 │ 1 │ 13286081543861427944 │ 5736227406744300673 │
└─────────────────────────┴──────────┴──────────────────────┴──────────────────────┘
Как это эффективнее сделать?
Хорошая задачка на изучение Window Functions. Тут вам нужна аггрегирующая функция - argMinIf(event_hash, time,us_chain) и RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING Если бы вы дали данные не в виде таблички с неудобными разделителями, а в виде заготовки select (with/arrayJoin), то было бы больше мотивации решить задачку за вас.
Ага, спасибо, сделаю
SELECT * FROM ( WITH arrayJoin([(1, 11110, 0), (2, 11111, 0), (3, 11112, 1), (4, 11113, 1), (5, 12111, 0), (6, 12112, 1), (7, 13111, 0)]) as data SELECT data.1 as timestamp, data.2 as event_hash, data.3 as is_chain );
Намек не пригодился? SELECT *,argMaxIf(event_hash, timestamp,is_chain=0) over (order by timestamp RANGE BETWEEN UNBOUNDED PRECEDING and CURRENT ROW ) as orig_hash FROM ( WITH arrayJoin([(1, 11110, 0), (2, 11111, 0), (3, 11112, 1), (4, 11113, 1), (5, 12111, 0), (6, 12112, 1), (7, 13111, 0)]) as data SELECT data.1 as timestamp, data.2 as event_hash, data.3 as is_chain );
Да, до argMaxIf я не дошел (((((. Не чувствую подобные вещи вообще
Обсуждают сегодня