【问题标题】:Clickhouse SQL Query: Average in intervalsClickhouse SQL 查询:间隔平均值
【发布时间】: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


【解决方案1】:

试试这个查询:

SELECT
    deviceId,
    valueType,
    groupArray((rounded_time, avg_value)) values
FROM (
  WITH 60 * 20 AS interval
  SELECT 
    deviceId, 
    valueType,
    toDateTime(intDiv(toUInt32(valueDateTime), interval) * interval) AS rounded_time,
    avg(value) avg_value
  FROM 
  (
      /* emulate the test dataset */
      SELECT
          number % 4 AS deviceId,
          now() - (number * 60) AS valueDateTime,
          number % 10 AS value,
          if((number % 2) = 1, 'temp', 'pres') AS valueType
      FROM numbers(48)
  ) 
  /*WHERE valueDateTime >= begin AND valueDateTime < end */
  GROUP BY 
    deviceId, 
    valueType, 
    rounded_time
  ORDER BY rounded_time
)
GROUP BY 
    deviceId,
    valueType
ORDER BY
    deviceId,
    valueType

/*
┌─deviceId─┬─valueType─┬─values────────────────────────────────────────────────────────────────────────────────────────────────────┐
│        0 │ pres      │ [('2021-02-12 06:00:00',4),('2021-02-12 06:20:00',4),('2021-02-12 06:40:00',4),('2021-02-12 07:00:00',0)] │
│        1 │ temp      │ [('2021-02-12 06:00:00',5),('2021-02-12 06:20:00',5),('2021-02-12 06:40:00',5),('2021-02-12 07:00:00',1)] │
│        2 │ pres      │ [('2021-02-12 06:00:00',4),('2021-02-12 06:20:00',4),('2021-02-12 06:40:00',4)]                           │
│        3 │ temp      │ [('2021-02-12 06:00:00',5),('2021-02-12 06:20:00',5),('2021-02-12 06:40:00',5)]                           │
└──────────┴───────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────┘
*/

我建议使用 Grafana 来可视化 CH 报告(请参阅 Grafana ClickHouse datasource)。

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多