如何按日/周/月维度展示PostgreSQL中的Token数据?
解决方案与建议
1. 是否可以自动按日/周/月维度展示?
完全可以实现自动切换维度展示,核心是在数据查询层做聚合处理,再将聚合结果传给Chart.js渲染。
PostgreSQL聚合查询示例
基于你现有数据结构,无需修改表结构,直接用PostgreSQL的日期函数分组计算:
- 按日聚合:
SELECT DATE(created) AS date, SUM(prompt_tokens) AS total_prompt_tokens, SUM(completion_tokens) AS total_completion_tokens, SUM(total_tokens) AS total_tokens FROM your_table GROUP BY DATE(created) ORDER BY date;
- 按周聚合(PostgreSQL默认周一为周起始,可通过
SET datestyle调整):
SELECT DATE_TRUNC('week', created)::DATE AS week_start, SUM(prompt_tokens) AS total_prompt_tokens, SUM(completion_tokens) AS total_completion_tokens, SUM(total_tokens) AS total_tokens FROM your_table GROUP BY DATE_TRUNC('week', created) ORDER BY week_start;
- 按月聚合:
SELECT DATE_TRUNC('month', created)::DATE AS month_start, SUM(prompt_tokens) AS total_prompt_tokens, SUM(completion_tokens) AS total_completion_tokens, SUM(total_tokens) AS total_tokens FROM your_table GROUP BY DATE_TRUNC('month', created) ORDER BY month_start;
前端切换逻辑
在页面添加日/周/月切换按钮,点击时调用对应聚合接口,拿到数据后更新Chart.js实例:
// 切换到周维度的示例逻辑 async function loadWeekData() { const res = await fetch('/api/aggregate?period=week'); const data = await res.json(); // 更新图表标签与数据 chart.data.labels = data.map(item => item.week_start); chart.data.datasets[0].data = data.map(item => item.total_prompt_tokens); chart.update(); }
2. 是否需要修改数据schema?
不需要修改现有schema。当前字段(uuid、各类token数、created)已完全满足聚合需求,created字段的ISO标准时间格式可被PostgreSQL直接解析处理。
如果后续数据量较大,可给created字段添加索引提升查询性能:
CREATE INDEX idx_created ON your_table(created);
额外实用建议
- 补全空维度数据:若某日/周/月无数据,查询结果不会返回对应条目,Chart.js图表会出现断层。可通过生成连续日期序列,左连接聚合结果补全空值。
- 优化维度标签显示:将周起始日期格式化为
2022-12-19 ~ 2022-12-25,月份格式化为2022年12月,提升图表可读性。 - 缓存聚合结果:若数据更新频率低,可将聚合结果缓存(如Redis),减少数据库重复查询压力。
内容的提问来源于stack exchange,提问作者Tasmia A.
相关产品推荐
相关产品推荐

