Dmitriy Gladkih
unread,Nov 25, 2016, 2:52:59 AM11/25/16Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to ClickHouse
При использовании CollapsingMergeTree работаем со старым и новым состояниями (набором параметров): { old_state, new_state }.
1) Открывается страница, счетчик имеет только новое состояние: new_state. На сервер посылается запрос: { null, new_state }. В CH записывается строка:
(1, 'user_uuid_0', 'visit_id_0', 'url', '', time_on_page_10_sec)
2) Пользователь выполняет клик через 5 секунд и мы хотим эту информацию сохранить. old_state = copy(new_state). На сервер посылается запрос: { old_state, new_state }. В CH записывается 2 строки:
(-1, 'user_uuid_0', 'visit_id_0', 'url', '', time_on_page_10_sec)
(1, 'user_uuid_0', 'visit_id_0', 'url', 'last_click_url_0', time_on_page_15_sec)
В итоге, в CH будут записи:
(1, 'user_uuid_0', 'visit_id_0', 'url', '', time_on_page_10_sec)
(-1, 'user_uuid_0', 'visit_id_0', 'url', '', time_on_page_10_sec)
(1, 'user_uuid_0', 'visit_id_0', 'url', 'last_click_url_0', time_on_page_15_sec)
Для PK (user_uuid, visit_id) записи могут быть схлопнуты, после чего останется только такая запись:
(1, 'user_uuid_0', 'visit_id_0', 'url', 'last_click_url_0', time_on_page_15_sec)
3) Допустим, что еще через 10 секунд пользователь выполнил еще клик. old_state = copy(new_state). На сервер посылается запрос: { old_state, new_state }. В CH записывается 2 строки:
(-1, 'user_uuid_0', 'visit_id_0', 'url', 'last_click_url_0', time_on_page_15_sec)
(1, 'user_uuid_0', 'visit_id_0', 'url', 'last_click_url_1', time_on_page_25_sec)
В итоге, в CH будут записи:
(1, 'user_uuid_0', 'visit_id_0', 'url', '', time_on_page_10_sec)
(-1, 'user_uuid_0', 'visit_id_0', 'url', '', time_on_page_10_sec)
(1, 'user_uuid_0', 'visit_id_0', 'url', 'last_click_url_0', time_on_page_15_sec)
(-1, 'user_uuid_0', 'visit_id_0', 'url', 'last_click_url_0', time_on_page_15_sec)
(1, 'user_uuid_0', 'visit_id_0', 'url', 'last_click_url_1', time_on_page_25_sec)
Таким образом, 'обновляется' информация о последнем клике и времени на странице.
Если нам нужно, например, получить статистику по url, то будет такой запрос:
SELECT url, sum(sign) AS cnt FROM tbl GROUP BY url HAVING cnt > 0
Если нужно получить среднее время на странице:
SELECT sum(time_on_page * sign) / sum(sign) AS avg_time_on_page FROM tbl