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

如何在Grafana中处理PostgreSQL非时序表实现堆叠柱状图?

需求实现方案

该需求完全可行,提供两种实现方式:

方案一:Grafana Transform 正确配置实现

步骤1:编写基础统计SQL

先执行分组统计的SQL,保留page、user、访问次数三个字段:

SELECT 
  page, 
  "user", 
  COUNT(*) AS visits
FROM your_table_name
WHERE date >= NOW() - INTERVAL 'x days' -- 替换x为你需要的天数
GROUP BY page, "user"
ORDER BY page;

执行后会得到如下结构的结果:

page,user,visits
home,user1,1
home,user2,1
foo,user3,1
bar,user1,1

步骤2:配置Grafana Transform

在Grafana的Transform面板中添加Rows to fields转换,关键配置如下:

  • Group by:选择page字段(这是避免丢失page列的核心)
  • Field name:选择user字段(用每个用户值作为新字段名)
  • Value field:选择visits字段(用访问次数作为对应字段的值)
  • 勾选Fill missing values,填充值设置为0

转换后会直接生成你需要的透视格式数据:

page,user1,user2,user3
home,1,1,0
foo,0,0,1
bar,1,0,0

步骤3:配置堆叠柱状图

将page设置为X轴,把生成的各个user*字段添加为系列,在图表设置中开启堆叠模式即可完成需求。

方案二:PostgreSQL单语句直接生成透视数据

如果不想依赖Grafana Transform,可以用PostgreSQL的条件聚合直接生成目标格式(适合用户列表相对固定的场景):

SELECT
  page,
  COUNT(CASE WHEN "user" = 'user1' THEN 1 END) AS user1,
  COUNT(CASE WHEN "user" = 'user2' THEN 1 END) AS user2,
  COUNT(CASE WHEN "user" = 'user3' THEN 1 END) AS user3
FROM your_table_name
WHERE date >= NOW() - INTERVAL 'x days'
GROUP BY page
ORDER BY page;

若用户列表是动态的,可以使用crosstab函数(需要提前安装tablefunc扩展):

-- 若未安装扩展,先执行一次:CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT * FROM crosstab(
  'SELECT page, "user", COUNT(*) AS visits FROM your_table_name WHERE date >= NOW() - INTERVAL ''x days'' GROUP BY page, "user" ORDER BY 1,2',
  'SELECT DISTINCT "user" FROM your_table_name WHERE date >= NOW() - INTERVAL ''x days'' ORDER BY 1'
) AS ct(page text, user1 int, user2 int, user3 int);

注:crosstab需要在结果定义中明确列名和类型,若用户数量动态变化,可结合字符串拼接生成动态SQL,但需要确保数据库权限允许。

内容的提问来源于stack exchange,提问作者mkst

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:50:24