【发布时间】:2018-10-18 16:45:05
【问题描述】:
假设我有一个给定的时间范围。为了解释,让我们考虑一些简单的事情,比如 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-011546210800 – 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 分钟而不是宿舍,并且 GROUP BY 至少还有一个属性,例如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
有没有办法以某种方式填充整个给定的间隔?就像 InfluxDB 有 fill 组参数或 TimescaleDb 的 time_bucket() 函数和 generate_series() 我试图搜索 ClickHouse 文档和 github 问题,似乎这还没有实现,所以问题可能是是否有任何解决方法。
【问题讨论】:
-
'WITH FILL' 可以从 Clickhouse 19.14 开始使用。不幸的是,这似乎只在简单的情况下才能正常工作,而无需通过其他属性进行额外的分组。
标签: sql clickhouse