如何计算grafana / postgres中不同记录的列值之间的差异
Posted
技术标签:
【中文标题】如何计算grafana / postgres中不同记录的列值之间的差异【英文标题】:How to calculate the difference between column values of different records in grafana/postgres 【发布时间】:2019-08-03 00:43:44 【问题描述】:我安装并连接了 Grafana 和 postgres。我使用 grafana 来显示我添加到 postgres 的数据图表。我的 postgres 数据库有一个表,其中包含来自多个来源的记录。架构如下所示:
time | source | bid | ask
12:01 | bitmex | 10 | 11
12:01 | deribit| 10 | 11
12:02 | bitmex | 9 | 11
每个来源的确切时间不同。我可以为每个来源绘制不同的线:
我希望绘制两个不同来源的差异(每分钟分组)。我认为我需要选择“source = x”和“source = y”相同的分组分钟并减去它们,同时保留来自 Grafana 的时间宏以保持整个过程的速度。谁能指出我正确的方向?我认为 grafana 中的“图形查询构建器”根本不可能做到这一点。
【问题讨论】:
【参考方案1】:我正在尝试做类似的事情。我没有进行连接,而是只进行了一次查询并在第 1 次查询中进行了数学运算并返回了我正在寻找的结果。
floor(extract(epoch from finished)/20)*20 AS "time",
first.value AS "value"
FROM (
SELECT
$__timeGroupAlias(finished,$__interval,0),
finished,
id,
(extract(epoch from minion_jobs.finished) * 1000) - (extract(epoch from minion_jobs.created) * 1000) AS value
FROM minion_jobs
WHERE queue = 'parallel'
GROUP BY value,minion_jobs.finished, id
)AS first
【讨论】:
【参考方案2】:我无法在 grafana 中执行此操作(减去两个查询),并且能够使用 postgres 查询(包括 grafana 宏)来执行此操作:
SELECT (first / second * 10000 - 10000) as spread, time
FROM
(
SELECT $__timeGroupAlias("time",$__interval,previous), avg(bid) AS "first"
FROM bbo_20s
WHERE $__timeFilter("time") AND market = 1
GROUP BY time
) AS e
FULL JOIN
(
SELECT $__timeGroupAlias("time",$__interval,previous), avg(bid) AS "second"
FROM bbo_20s
WHERE $__timeFilter("time") AND market = 2
GROUP BY time
) AS c
USING ("time") ;
结果看起来像这样并且非常高效:
【讨论】:
以上是关于如何计算grafana / postgres中不同记录的列值之间的差异的主要内容,如果未能解决你的问题,请参考以下文章
Grafana 与 springboot 和 postgres 的集成
Grafana PostgreSQL 与时间序列不同 on()
Grafana Postgres 使用可具有多个值的 Where 查询时出错