【发布时间】:2021-06-07 06:32:09
【问题描述】:
我正在尝试将 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 的某些引擎进行聚合的想法、解决方法都将受到高度赞赏。
【问题讨论】:
-
您的表格命中数不正确。为什么 MergeTree 有 AggregateFunction? MergeTree 不会折叠 AggregateFunction。
-
test.fooagr 是什么?
-
使用
uniqExact(sessionId)或更好的uniq(sessionId)而不是count(DISTINCT sessionId) -
嘿@DennyCrane,
AggregateFunction和test.fooagr,由于错误的复制粘贴和试图简化 sn-ps 导致的拼写错误。使用uniq(sessionId)或count(DISTINCT sessionId)不会计算跳出,因为sessionId出现在另一个组中,因为我想找出哪些页面跳出最多。
标签: sql time-series clickhouse