【问题标题】:Grafana, postgresql: aggregate function calls cannot contain window function callsGrafana、postgresql:聚合函数调用不能包含窗口函数调用
【发布时间】:2021-11-27 11:38:21
【问题描述】:

在 Grafana 中,我们希望显示在所选时间间隔内指示最大 15 分钟平均值的条形。我们的数据有固定的 1 分钟间隔。数据库是 Postgresql。

为了显示 15 分钟的平均值,我们使用以下查询:

SELECT
  timestamp AS time,
  AVG(rawvalue) OVER(ORDER BY timestamp ROWS BETWEEN 7 PRECEDING AND 7 FOLLOWING) AS value,
  '15-min Average' AS metric
FROM database.schema
WHERE $__timeFilter(timestamp) AND device = '$Device'
ORDER BY time

为了在选定的时间间隔内显示表示最大原始值的条形,我们使用以下查询:

SELECT
  $__timeGroup(timestamp,'$INTERVAL') AS time,
  MAX(rawvalue) AS value,
  'Interval Max' AS metric
FROM database.schema
WHERE $__timeFilter(timestamp) AND device = '$Device'
GROUP BY $__timeGroup(timestamp,'$INTERVAL')
ORDER BY time

两种解决方案的简单组合不起作用:

SELECT
  $__timeGroup(timestamp,'$INTERVAL') AS time,
  MAX(AVG(rawvalue) OVER(ORDER BY timestamp ROWS BETWEEN 7 PRECEDING AND 7 FOLLOWING)) AS value,
  'Interval Max 15-min Average' AS metric
FROM database.schema
WHERE $__timeFilter(timestamp) AND device = '$Device'
GROUP BY $__timeGroup(timestamp,'$INTERVAL')
ORDER BY time

我们得到错误:“pq:聚合函数调用不能包含窗口函数调用”。

有一个关于 SO 使用 "with" (Count by criteria over partition) 的建议,但我不知道在我们的案例中使用它是否热门。

【问题讨论】:

    标签: sql postgresql aggregate-functions grafana window-functions


    【解决方案1】:

    将第一个查询用作第二个查询的 CTE(或 with)。 CTE 的order by 子句和第二个查询的where 子句以及CTE 的metric 列不再需要。或者,您可以将第一个查询用作第二个查询的 from 子句中的派生表。

    with t as
    (
     SELECT
       timestamp AS time,
       AVG(rawvalue) OVER(ORDER BY timestamp ROWS BETWEEN 7 PRECEDING AND 7 FOLLOWING) AS value
     FROM database.schema
     WHERE $__timeFilter(timestamp) AND device = '$Device'
    )
    SELECT
      $__timeGroup(time,'$INTERVAL') AS time,
      MAX(value) AS value,
      'Interval Max 15-min Average' AS metric
    FROM t
    GROUP BY 1 ORDER BY 1;
    

    不相关,但 $__timeFilter$__timeGroup 是什么?它们的语义很清楚,但它们来自哪里?顺便说一句,您可能会发现 this 函数很有用。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    相关资源
    最近更新 更多