данные событий, приблизительно такого формата:
┌──EventDate─┬─SessionID────────────────────────────┐
│ 2020-01-01 │ 9e1c6895-172b-453f-a50b-539fb5247cdb │
│ 2020-01-01 │ 0feb6e63-9888-4583-8645-3b105531a4be │
│ 2020-01-01 │ 99308732-7ad0-44f1-ab23-cd041b9b9059 │
│ 2020-01-01 │ e67ecae0-bfaf-4ee7-a6eb-a17cdcc71bbf │
│ 2020-01-01 │ 75f9bb22-c5e6-4c02-8c62-d81431287746 │
│ │ │
│ 2020-01-02 │ 99308732-7ad0-44f1-ab23-cd041b9b9059 │
│ 2020-01-02 │ 75f9bb22-c5e6-4c02-8c62-d81431287746 │
│ 2020-01-02 │ 46a44ca7-e71a-4a7b-81b6-a896ca824575 │
│ 2020-01-02 │ 9e1c6895-172b-453f-a50b-539fb5247cdb │
│ 2020-01-02 │ 3ac10b96-f992-4ddd-b678-56539866cebc │
└────────────┴──────────────────────────────────────┘
Нужно достать кол-во сессий за один день с разбивкой по 1 часу.
Первое что приходит в голову это такой запрос:
select toStartOfHour(EventTime) k, uniqCombined(SessionID)
from events
where EventDate = '2020-01-01'
group by k order by k
Результат:
┌───────────────────k─┬─uniqCombined(SessionID)─┐
│ 2020-01-01 16:00:00 │ 116 │
│ 2020-01-01 13:00:00 │ 88 │
│ 2020-01-01 22:00:00 │ 73 │
│ 2020-01-01 23:00:00 │ 35 │
│ 2020-01-01 20:00:00 │ 120 │
│ 2020-01-01 17:00:00 │ 114 │
│ 2020-01-01 14:00:00 │ 122 │
│ 2020-01-01 19:00:00 │ 154 │
│ 2020-01-01 18:00:00 │ 129 │
│ 2020-01-01 15:00:00 │ 122 │
│ 2020-01-01 21:00:00 │ 90 │
└─────────────────────┴─────────────────────────┘
Вопрос:
Как правильнее посчитать не просто uniq от сессий по каждому часу,
но еще разделить на New / Returning user.
New - если в текущий час пользователь пришел впервые.
Returning - это если SessionID уже есть в предыдущем периоде.
Или это будет сложный запрос и лучше думать как сохранять IsNew флаг в момент вставки записи?
проще всего считать новых людей через колонку с флажком. это правда не избавляет от некотроых любопытных спецэффектов, но лучше чем нумеровать их при чтении.
state-ы можно вычитать и складывать, поэтому можно сделать на массивах https://groups.google.com/forum/#!topic/clickhouse/BqE49KuJpw8
Обсуждают сегодня