假设我有一个给定的时间范围。为了解释,让我们考虑一些简单的事情,比如2018年全年。我想从clickhouse查询数据,作为每个季度的总和聚合,因此结果应该是4行。
问题是,我只有两个季度的数据,所以当使用 GROUP BY quarter
,只返回两行。
SELECT
toStartOfQuarter(created_at) AS time,
sum(metric) metric
FROM mytable
WHERE
created_at >= toDate(1514761200) AND created_at >= toDateTime(1514761200)
AND
created_at <= toDate(1546210800) AND created_at <= toDateTime(1546210800)
GROUP BY time
ORDER BY time
``` `1514761200` –
2018-01-01 `1546210800` – `2018-12-31` 这将返回:
time metric
2018-01-01 345
2018-04-01 123
我需要:
time metric
2018-01-01 345
2018-04-01 123
2018-07-01 0
2018-10-01 0
这是一个简化的示例,但在实际用例中,聚合将是5分钟而不是四分之一,groupby至少还有一个属性,如 `GROUP BY attribute1, time` 所以期望的结果是
time metric attribute1
2018-01-01 345 1
2018-01-01 345 2
2018-04-01 123 1
2018-04-01 123 2
2018-07-01 0 1
2018-07-01 0 2
2018-10-01 0 1
2018-10-01 0 2
有没有办法填满整个给定的时间间隔?就像XDB一样 `fill` 组或timescaledb的参数 `time_bucket()` 函数 `generate_series()` 我试图搜索clickhouse文档和github问题,但这似乎还没有实现,所以问题可能是是否有任何解决方法。
4条答案
按热度按时间gzszwxb41#
可以使用“number”函数生成零值。然后使用union all和already将您的查询和零值连接起来,并根据获得的数据进行分组。
因此,您的查询将如下所示:
注意:touint16(0)-零值必须与
metrics
py49o6xq2#
在clickhouse 19.14中,您可以使用
WITH FILL
条款。它可以这样填满四分之一的空间:czfnxgou3#
作为
numbers()
某些情况下的功能range
数组函数也很有用。示例:对于每对(id1,id2),应生成前7天的日期。
该选择的结果可以在union all中用于填充数据中的“孔”。
2nbm6dog4#
这是我如何做到的小时桶(需要在格拉法纳形象化),感谢@filimonov和@mikhail
例如,对于2019-01-01到2019-01-02的范围,它将为您提供: