首页 > 解决方案 > 按月优化 postgres 查询平均值 [已编辑]

问题描述

我们有这张表可以每天多次保存价格,我们需要按月获取每天的平均价格。

基本上,我们根据代码和日期过滤这些价格,并UNION为每个月使用

表格示例:

日期 代码 价格
2020-01-01 'FS-H21' 150
2020-01-01 'FS-H21' 151
2020-01-01 'FS-G21' 155
2020-01-02 'FS-H21' 151
2020-01-03 'FS-G21' 148

和查询示例:

SELECT period, code, avg(price)
FROM period_prices
WHERE code = 'FS-F21' AND period BETWEEN '2020-01-01' AND '2020-01-31'
GROUP BY period, code

UNION

SELECT period, code, avg(closure)
FROM period_prices
WHERE code = 'FS-F21' AND period BETWEEN '2020-02-01' AND '2020-02-29'
GROUP BY period, code

...

在示例查询中重现表和查询...

编辑:

期望的结果:

FS-H21每天存储 3 个价格。报告必须显示该代码在特定时期内每一天的平均价格,例如一个月 ( BETWEEN '2020-01-01' AND '2020-01-31')

桌子:

日期 代码 价格
2020-01-01 'FS-H21' 150
2020-01-01 'FS-H21' 151
2020-01-01 'FS-H21' 152
2020-01-03 'FS-H21' 150
2020-01-03 'FS-H21' 152
2020-01-04 'FS-H21' 155

查询结果:| 日期 | 代码 | 平均 | | -- | -- | --| | 2020-01-01 | 'FS-H21' | 151 | | 2020-01-04 | 'FS-H21' | 151 | | 2020-01-05 | 'FS-H21' | 155 |

我想要一些关于如何提高该查询的性能的建议,或者是否有更好的方法来实现这一点!

谢谢

标签: sqlpostgresqlquery-optimization

解决方案


大概,您想按月而不是按汇总。那将是:

SELECT DATE_TRUNC('month', period) as yyyymm, code, avg(closure)
FROM period_prices
WHERE code = 'FS-F21' 
GROUP BY yyyymm, code;

如果您想要每天的平均值,那么您可以只使用一个查询:

SELECT period, code, avg(closure)
FROM period_prices
WHERE code = 'FS-F21' 
GROUP BY period, code;

推荐阅读