如何在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
相关产品推荐
相关产品推荐

