使用 Clickhouse 计算跳出率

问题描述

我正在尝试将 Clickhouse 用于我的一个小型分析应用程序,并且我有一个将原始点击记录为:

CREATE TABLE hits (
  sessionId LowCardinality(String),page LowCardinality(String),timestamp DateTime,projectId UInt16
) ENGINE = MergeTree() PARTITION BY toYYYYMM(timestamp)
ORDER BY (projectId,page,toStartOfHour(timestamp)) --
  SETTINGS index_granularity = 8192;

之后我可以添加一些示例数据:

sessionId page    timestamp            projectId 
xxx       /       2021-03-12 13:51:12  1         
yyy       /       2021-03-12 13:51:12  1         
xxx       /cool   2021-03-12 13:52:12  1         
fff       /       2021-03-12 13:53:12  1                 

我想要实现的是计算每页的反弹(唯一 sessionId 发生)和浏览量,例如:

page   bounces views projectId
/      2       3     1
/cool  0       1     1

我可以轻松计算每页的浏览次数,但由于 sessionId 子句,唯一的 GROUP BY 计数失败:

SELECT page,projectId,count(*) as views,count(disTINCT sessionId) as bounces --fail
from hits
GROUP BY (page,projectId);

任何有关更改 Clickhouse 架构或什至使用 Clickhouse 的一些引擎进行聚合的想法、解决方法都将受到高度赞赏。

解决方法

检查https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/parametric-functions/#function-sequencecount

select projectId,p[1] page,countIf(length(p)=1) bounce
from (
SELECT 
  projectId,sessionId,groupArray( page ) p
from hits
GROUP BY sessionId,projectId )
group by projectId,page