【问题标题】:Calculate bounce rate with Clickhouse使用 Clickhouse 计算跳出率
【发布时间】: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,AggregateFunctiontest.fooagr,由于错误的复制粘贴和试图简化 sn-ps 导致的拼写错误。使用uniq(sessionId)count(DISTINCT sessionId) 不会计算跳出,因为sessionId 出现在另一个组中,因为我想找出哪些页面跳出最多。

标签: sql time-series clickhouse


【解决方案1】:

查看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

【讨论】:

  • 嘿,非常感谢您的回答,它实际上就像一个魅力。我看了一下sequenceCount,但我不太确定它如何与参数值一起使用。你介意用一个例子更新答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
相关资源
最近更新 更多