我有一个带有created_at(DateTime),userid(String),eventid(String)列的事件表。这里的userid可以重复,而eventid始终是唯一的uuid。
我希望构建唯一和非唯一的频率直方图。
在给定的三个输入的基础上,这同时适用于eventid和userid
在这里,存储桶将由(end_datetime-start_datetime)/ interval决定。
输出以开始日期时间,结束日期时间和频率显示。 在任何时间间隔内,如果没有可用数据,则出现start_datetime和end_datetime,但频率为0。
如何为此建立通用查询?
我查看了直方图函数,但找不到任何相关文档。尝试时,我无法理解输入和输出之间的关系。
答案 0 :(得分:0)
我使用以下方法使它起作用。在这里,可以将toStartOfMonth更改为CH中的其他类似函数。
select toStartOfMonth(`timestamp`) interval_data , count(distinct uid) count_data
from g94157d29.event1
where `timestamp` >= toDateTime('2018-11-01 00:00:00') and `timestamp` <= toDateTime('2018-12-31 00:00:00')
GROUP BY interval_data;
和
select toStartOfMonth(`timestamp`) interval_data , count(*) count_data
from g94157d29.event1
where `timestamp` >= toDateTime('2018-11-01 00:00:00') and `timestamp` <= toDateTime('2018-12-31 00:00:00')
GROUP BY interval_data;
但是在事件表中,每月超过20亿条记录的性能非常低,其中toYYYYMM(时间戳)是分区的,toYYYYMMDD(时间戳)是排序的。
非重复计数查询需要> 30GB的空间和30秒的时间。尚未完成。
一般计数查询需要10到20秒才能完成。
答案 1 :(得分:0)
count(distinct XXX)
已过时。
更有用的uniq(XXX)
或uniqExact(XXX)