【发布时间】:2021-05-15 20:51:15
【问题描述】:
我有一张桌子: deviceId、valueDateTime、value、valueType
其中valueType - 温度、压力等
我有几个查询参数:开始、结束(期间)和时间间隔(例如 20 分钟) 我想为每个 deviceId 和 valueType 获取该期间的图表,其中包含该期间每个间隔的一系列平均值。
编辑: 以上是最后的任务,此时我只是在尝试这个任务,我使用https://play.clickhouse.tech/?file=playground 尝试解决类似的任务。我想计算按标题字段分组的时间间隔内的平均年龄。我有一个问题,如何按标题添加分组?
-- 2013-07-15 00:00:00 - begin
-- 2013-07-16 00:00:00 - end
-- 1200 - average in interval 20m
SELECT t, avg(Age) as Age FROM (
SELECT
arrayJoin(
arrayMap(x -> addSeconds(toDateTime('2013-07-15 00:00:00'), x * 1200),
range(toUInt64(dateDiff('second', toDateTime('2013-07-15 00:00:00'), toDateTime('2013-07-16 00:00:00'))/1200)))
) as t,
null as Age
UNION ALL
SELECT
(addSeconds(
toDateTime('2013-07-15 00:00:00'),
1200 * intDivOrZero(dateDiff('second', toDateTime('2013-07-15 00:00:00'), EventTime), 1200))
) as t,
avg(Age) as Age
FROM `hits_100m_obfuscated`
WHERE EventTime BETWEEN toDateTime('2013-07-15 00:00:00') AND toDateTime('2013-07-16 00:00:00')
GROUP BY t
)
GROUP BY t ORDER BY t;
已编辑 2 vladimir 的正确答案适用于https://play.clickhouse.tech/?file=playground
SELECT
Title, -- as deviceId
JavaEnable, -- as valueType
groupArray((rounded_time, avg_value)) values
FROM (
WITH 60 * 20 AS interval
SELECT
Title,
JavaEnable,
toDateTime(intDiv(toUInt32(EventTime), interval) * interval)
AS rounded_time, -- EventTime as valueDateTime
avg(Age) avg_value -- Age as value
FROM `hits_100m_obfuscated`
WHERE
EventTime BETWEEN toDateTime('2013-07-15 00:00:00')
AND toDateTime('2013-07-16 00:00:00')
GROUP BY
Title,
JavaEnable,
rounded_time
ORDER BY rounded_time
)
GROUP BY
Title,
JavaEnable
ORDER BY
Title,
JavaEnable
【问题讨论】:
-
您使用什么来可视化报告 - Grafana?
-
@vladimir - 不,我尝试编写 SQL 查询。 (我编辑并在标题中添加了“sql”)
-
ok - 可以提供原始表的架构和您的 sql 脚本吗?
-
在决定使用 clickhouse 之前,我正在探索它,在我的问题中添加了详细信息
标签: clickhouse