我正在设置Grafana和MariaDB的组合。我的目标之一是显示表格中值的累计总和作为Grafana时间序列。
我似乎在SQL查询中需要一个求和变量。
如果我在数据库上手动输入查询(例如在HeidiSQL中),则这样的查询可行。当我将查询方案接管到Grafana Web界面时,它不起作用。
示例:
我有一张这样的桌子
`ID` INT(11) NOT NULL AUTO_INCREMENT,
`Datum` DATE NOT NULL,
'Sachkosten` INT(11) NOT NULL
我想显示Sachkosten的累积总和。当我执行时,它可以在数据库上手动工作:
set @csum := 0;
SELECT
UNIX_TIMESTAMP(Datum) as time_sec,
Datum,
Sachkosten as value,
'Sachkosten' as metric,
(@csum := @csum + Sachkosten) as cumulative_sum
FROM aufwand
ORDER BY Datum ASC
上面的直接在数据库上按预期工作:第五列是第三列的累积总和:
"1569801600" "2019-09-30" "-6000" "Sachkosten" "-6000"
"1569801600" "2019-09-30" "35000" "Sachkosten" "29000"
"1572220800" "2019-10-28" "-4000" "Sachkosten" "25000"
当我在Grafana中输入相同的内容时,在使用@csum变量时会出现错误。在上面的示例中:
Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT
UNIX_TIMESTAMP(Datum) as time_sec,
Datum,
Sachkosten as value' at line 2
我们这里有一些英雄,知道如何使这种查询变量在Grafana中工作吗?还是采用其他方式来计算该累计和?
答案 0 :(得分:0)
我猜测您不能在一个查询中合并两个语句。尝试在子查询中设置变量:
SELECT UNIX_TIMESTAMP(Datum) as time_sec, Datum, Sachkosten as value,
'Sachkosten' as metric,
(@csum := @csum + Sachkosten) as cumulative_sum
FROM aufwand CROSS JOIN
(SELECT @csum := 0) params
ORDER BY Datum ASC;
或者,也许会起作用:
SELECT UNIX_TIMESTAMP(Datum) as time_sec, Datum, Sachkosten as value,
'Sachkosten' as metric,
SUM(Sachkosten) OVER (ORDER BY Datum) as cumulative_sum
FROM aufwand CROSS JOIN
(SELECT @csum := 0) params
ORDER BY Datum ASC;
请注意,在较新版本的MySQL中,ORDER BY
可能不会影响累积和的顺序。您需要使用带有ORDER BY
的子查询来确保。