You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中创建适配版本的动态测试结果查询?

动态生成PostgreSQL聚合列并在Grafana展示

推荐方案:Grafana模板变量实现

由于数据库每日更新、版本动态变化,用Grafana模板变量直接在查询层生成动态列,无需修改数据库,步骤如下:

  1. 创建版本模板变量

    • 进入Dashboard设置,添加Query类型模板变量
    • 数据源选你的PostgreSQL库,查询语句写:SELECT DISTINCT version FROM results ORDER BY version
    • 变量名设为versions,保存
  2. 编写动态查询
    在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),替换对应字段名即可

  3. 配置可视化

    • 选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:05:00