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)
改动说明
- 排序依据替换:用
DATE_TRUNC('month', updated_on)获取每个记录所属月份的起始时间(如2024-01-01 00:00:00),按这个值排序就能保证严格的时间顺序,即使跨年度也不会出错。 - 分组调整:GROUP BY中加入
DATE_TRUNC('month', updated_on),确保同一月份(含年份)的记录被正确分组,避免不同年份同月份的记录被合并(如果查询范围跨年度的话)。 - 保留月份名称:依然用
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
相关产品推荐
相关产品推荐

