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

Grafana使用PostgreSQL实现月份chronological排序的Bar gauge仪表盘问题

解决PostgreSQL按月份时间顺序排序的问题

你的查询目前按月份名称(字符串)排序,PostgreSQL会默认按字母顺序排列,导致月份顺序不符合时间逻辑。要改成按时间顺序排列,关键是基于月份的时间值而非名称字符串来排序。

修改后的查询代码

SELECT 
    NOW() as time, 
    TO_CHAR(updated_on, 'Month') AS month_name,
    SUM(time_spent_minutes)/COUNT(DISTINCT ticket_id) AS "Avg"
FROM ticket_messages
WHERE 
    admin_id IN ('20439', '20457', '20291', '20371', '20357', '20235','20449','20355','20488') 
    AND updated_on BETWEEN NOW() - INTERVAL '1 YEAR' AND NOW()
GROUP BY DATE_TRUNC('month', updated_on), TO_CHAR(updated_on, 'Month')
ORDER BY DATE_TRUNC('month', updated_on)

改动说明

  1. 排序依据替换:用DATE_TRUNC('month', updated_on)获取每个记录所属月份的起始时间(如2024-01-01 00:00:00),按这个值排序就能保证严格的时间顺序,即使跨年度也不会出错。
  2. 分组调整:GROUP BY中加入DATE_TRUNC('month', updated_on),确保同一月份(含年份)的记录被正确分组,避免不同年份同月份的记录被合并(如果查询范围跨年度的话)。
  3. 保留月份名称:依然用TO_CHAR(updated_on, 'Month')输出月份名称,满足仪表盘的展示需求。

如果你的查询范围不会跨年度(比如只查今年的12个月),也可以简化为按月份数字排序:

SELECT 
    NOW() as time, 
    TO_CHAR(updated_on, 'Month') AS month_name,
    SUM(time_spent_minutes)/COUNT(DISTINCT ticket_id) AS "Avg"
FROM ticket_messages
WHERE 
    admin_id IN ('20439', '20457', '20291', '20371', '20357', '20235','20449','20355','20488') 
    AND updated_on BETWEEN NOW() - INTERVAL '1 YEAR' AND NOW()
GROUP BY TO_CHAR(updated_on, 'Month'), EXTRACT(MONTH FROM updated_on)
ORDER BY EXTRACT(MONTH FROM updated_on)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:15:58