TP
Имеется таблица:
CREATE TABLE events (
event_time DateTime,
event_id UUID,
country String,
state String
) ENGINE = MergeTree()
Пускай в таблицу пишутся некие события, каждое со своим event_id и state=new. Также для некоторых событий приходят обновления значения state (например processing, rejected, approved и т.д.) и для сохранения этого факта в ту же таблицу записывается новая строка с ранее известным event_id (а также country), но свежим event_time и state. Таким образом для каждого уникального event_id актуальное значение state лежит в строке с максимальным event_time.
Требуется выполнить аналитический запрос и получить количество событий со state равным rejected и approved с группировкой по country. Первое, что приходит в голову:
SELECT
country,
sum(state='rejected') as rejected,
sum(state='approved') as approved,
FROM (
SELECT any(country) AS country, argMax(state, event_time) as state
FROM events
GROUP BY event_id
)
GROUP BY country
Но GROUP BY event_id не выглядит хорошим решением. Напрашивается использование ReplacingMergeTree, но он не даёт гарантии отсутствия дубликатов. Есть альтернативные способы построить подобный запрос? Или надо как-то менять структуру хранения событий?