bbartling
bbartling

Reputation: 3514

Grafana dashboards combine two SQL queries

I have one Grafana dashboard with 2 queries that sum certain data from a postgres (timescale) db. Both queries are nearly identical, is it possible to combine these two queries into one as well as combining the sums?

Query one:

SELECT
    $__timeGroup(time, '1m'),
    SUM(value*2.119) as "Trane VAVs"
FROM 
    slipstream_volttron
WHERE
    $__timeFilter("time") AND
    (metric ~ 'slipstream_internal/slipstream_hq/.*/Discharge Air Flow$')
GROUP BY 1
ORDER BY 1

Query two:

SELECT
    $__timeGroup(time, '1m'),
    SUM(value) as "JCI VAVs"
FROM 
    slipstream_volttron
WHERE
    $__timeFilter("time") AND
    (metric ~ 'slipstream_internal/slipstream_hq/.*/SA-F$')
GROUP BY 1
ORDER BY 1

For example this screenshot is what it looks like hoping to combine these queries and SUMS where there would be only 1 line not two. One line of all of the data summed up.

enter image description here

Upvotes: 1

Views: 16224

Answers (2)

dnnshssm
dnnshssm

Reputation: 1305

In addition to Ryan's answer that uses a query to combine the two results, I want to share a way to accomplish your goal with Grafana.

You can use a Transformation. Go to the tab Transform, select Add field from calculation, and chose Mode: Binary operation. Then you can select your two query results, choose + as operator, give an alias and choose to hide the inital fields if you want.

Upvotes: 2

Ryan
Ryan

Reputation: 156

This can be accomplished in Postgres with an aggregate FILTER(). Something like:

SELECT
    $__timeGroup(time, '1m'),
    SUM(value*2.119) FILTER(WHERE metric ~ 'slipstream_internal/slipstream_hq/.*/Discharge Air Flow$') as "Trane VAVs",
    SUM(value) FILTER(WHERE metric ~ 'slipstream_internal/slipstream_hq/.*/SA-F$') as "JCI VAVs"
FROM 
    slipstream_volttron
WHERE
    $__timeFilter("time")
GROUP BY 1
ORDER BY 1

That said, without knowing the schema of slipstream_volttron (column types, indexes, etc.) there might be some additional efficiencies that would improve the query speed, etc. FILTER() is applied to the all rows that match the query predicates so if you have lots of raw data, you would try to add a WHERE clause on the main query that would use indexes to return fewer rows (in addition to the time column that you're filtering on)

Also, depending on what type of your metric column is, the cardinality, and how it's indexed, you could probably get better query performance with a few more tweaks. Regex is a powerful tool but not always the most efficient during real-time aggregation.

Upvotes: 1

Related Questions