首页 > 解决方案 > 40 个季度的 SQL 平均值

问题描述

我需要最近 40 个季度的一篇文章的平均销售额:

select amountofsale, year, quarter, article from table1
+---------+--------+--------+-----------+----
| amountofsale | year | quarter | article   | 
+---------+--------+--------+-----------+----
|      50      | 2019 |   3     | article1  | 
|      40      | 2019 |   2     | article1  | 
|      42      | 2019 |   1     | article1  |
|      ...     | ...  |   ...   | article1  |  
|      2       | 2009 |   4     | article1  |
|      204     | 2009 |   3     | article1  |  
|      150     | 2019 |   3     | article2  | 
|      95      | 2019 |   2     | article2  | 
|      23      | 2019 |   1     | article2  |
|      ...     | ...  |   ...   | article2  |  
|      14      | 2009 |   4     | article2  | 
|      204     | 2009 |   3     | article2  |  
+---------+--------+--------+-----------+-----

结果:2019 年第三季度至 2009 年第四季度的平均值 =40 值

+---------+--------+--------+-----------+----
| Avg          | article |
+---------+--------+--------+-----------+----
|      33.5    | article1|  
|      70.5    | article2|  

如果 2019Q4 可用,则平均值应该是从 Q12010 到 Q42019

最好的齐奥

标签: sqlpostgresqlgroup-by

解决方案


我需要最近 40 个季度的一篇文章的平均销售额:

这是做你想做的吗?

select article, avg(amountofsale)
from t
where year > 2009 or year = 2009 and quarter >= 3
group by article;

在 Postgres 中,您可以将where子句简化为:

where (year, quarter) >= (2009, 3)

如果您特别想要 40 个季度的时间倒流(上面的内容不太适用):

where year * 4 + quarter >= extract(year from now()) * 4 + extract(quarter from now()) - 40;

如果您希望它从文章数据中的最近一个季度按时间顺序倒退 40 个季度:

select article, avg(amountofsale)
from (select t.*,
             max(year * 4 + quarter) as max_yq
      from t
     ) t
where (year * 4 + quarter) >= max_yq - 40
group by article;

推荐阅读