event_id, user_id, status
1 1 success
2 1 fail
3 1 success
….
Можно ли как-то сделать табличку, что бы считать только первый success евент для каждого user_id ? аля where status = ‘success’ order by event_id limit 1 by user_id
если нужна таблица, то можно сделать mv, которая будет смотреть на базовую таблицу с евентами можно сделать просто view с вашим запросом
create table tab1(event_id UInt8, user_id UInt8, status String, ver Datetime default now()) engine=ReplacingMergeTree partition by (ver) order by event_id; create materialized view mv1 to tab1 as select event_id, user_id, status from event where status=‘success’ order by event_id limit 1 by user; Как пример, может быть вам такое подойдет.
ну мне реплейсинг не подойдет, тк он берет максимальную версию, а мне минимальная нужна
ну для этого достаточно просто "инвертировать" версию version = max_possible_time - now()
что значит max_possible_time ? timestamp записи ? если да, то он растет пропрционально now() и в зависимости от того, когда эта запись попадет в кх, будет разный ver для одной и той же записи
>что значит max_possible_time ? 4102434000 - toUInt32(now())
а так не пробовали? select user_id, min(event_id) from ... where status = 'success' group by user_id или select user_id, minIf(event_id, status = 'success') from ... group by user_id
дак оно-то работает, но данных много обрабатывать. Хочется как-то меньше
тогда можно сделать materialized view, хранить там текущий state по user_id и доагрегировать запросом minMerge https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/aggregatingmergetree/ https://clickhouse.tech/docs/ru/sql-reference/aggregate-functions/combinators/#state
о, я что-то совсем забыл про такое
Обсуждают сегодня