如何在PostgreSQL中创建适配版本的动态测试结果查询?
动态生成PostgreSQL聚合列并在Grafana展示
推荐方案:Grafana模板变量实现
由于数据库每日更新、版本动态变化,用Grafana模板变量直接在查询层生成动态列,无需修改数据库,步骤如下:
创建版本模板变量
- 进入Dashboard设置,添加
Query类型模板变量 - 数据源选你的PostgreSQL库,查询语句写:
SELECT DISTINCT version FROM results ORDER BY version - 变量名设为
versions,保存
- 进入Dashboard设置,添加
编写动态查询
在Panel查询中用模板变量渲染列:SELECT test, {{ range $idx, $v := .Values.versions }} MAX(CASE WHEN version = '{{ $v }}' THEN results END) AS "{{ $v }}"{{ if ne $idx (sub (len .Values.versions) 1) }},{{ end }} {{ end }} FROM results GROUP BY test ORDER BY test;提示:如果实际字段是
throughput(而非示例里的results),替换对应字段名即可配置可视化
- 选
Bar Chart或Line Chart,X轴绑定test字段,Y轴会自动识别所有版本列 - 调整图例设置,确保每个版本对应正确的系列
- 选
备选方案:PostgreSQL动态SQL函数
如果需要在数据库层封装逻辑,可创建PL/pgSQL函数:
CREATE OR REPLACE FUNCTION get_test_results_by_version() RETURNS SETOF record AS $$ DECLARE dynamic_cols text; BEGIN -- 生成动态CASE片段 SELECT string_agg( format('MAX(CASE WHEN version = %L THEN results END) AS %I', version, version), ', ' ) INTO dynamic_cols FROM (SELECT DISTINCT version FROM results ORDER BY version) v; -- 执行动态查询 RETURN QUERY EXECUTE format( 'SELECT test, %s FROM results GROUP BY test ORDER BY test', dynamic_cols ); END; $$ LANGUAGE plpgsql;
调用时需指定返回列结构(适配当前版本):
SELECT * FROM get_test_results_by_version() AS t( test text, "ABC" integer, "DEF" integer, "GHI" integer );
注意:版本更新后需调整调用时的列结构,灵活性不如Grafana模板方案
注意事项
- 版本名含特殊字符时,
format函数的%I会自动处理标识符,避免语法错误 - 清理
results表中test字段的空值,或用MAX(test) AS test聚合,确保分组后test值正确:SELECT MAX(test) AS test, -- 动态列部分 FROM results GROUP BY COALESCE(test, 'Unknown')
内容的提问来源于stack exchange,提问作者Elad
相关产品推荐
相关产品推荐

