在SQL中使用覆盖和分区

时间:2018-11-27 09:53:47

标签: sql sql-server window-functions

我有一个SQL表,其中包含不同类别产品(例如水果,蔬菜,乳制品)的月度价格。 我想在同一查询中计算特定类别以及当月所有产品的运行月平均值。

所以结合起来:

Select date, avg(price) group by date where category = 'Fruit'

Select date, avg(price) group by date

是否可以使用OVER&Partition(或其他任何方式)

修改

  • 我正在使用MS SQL
  • 我的数据是每月的,所以我不需要提取月底的日期-我可以按日期分组,这样我就可以获得月底的数据
  • 例如,如果我的表如下所示:

|日期|项目|类别|价格|
| Jan |香蕉|水果10 |
| Jan |土豆|蔬菜| 20 |

那么输出将是

日期|水果平均价|整体平均|
一月| 10 | 15

为弄乱表而事先致歉,但这是针对另一个线程的。

谢谢

3 个答案:

答案 0 :(得分:0)

为什么需要结束?

Select date, category , avg(price) group by date, category 

答案 1 :(得分:0)

尝试使用

Select extract(year from date)||extract(month from date) as month, 
       category, avg(price) as avg_price            
  from sales
 group by month, category

P.S。在某些数据库系统中可能不允许使用别名month,在这种情况下,group by列表中的{替换为extract(year from date)||extract(month from date)。连接运算符也可能不同,只要遇到这种情况,就用加号(||)替换管道(+)。

答案 2 :(得分:0)

如果您希望每月 一行,并且数据有多行,则需要汇总:

select date_trunc('month', date) as month, 
       avg(price) as avg_per_month,
       avg(avg(price)) over (order by date_trunc('month', date))
from t
where category = 'Fruit'
group by date_trunc('month', date)
 order by date_trunc('month', date);

如果您每月只有一排,那么您可以这样做:

select date, price,
       avg(price) over (order by date)
from t
where category = 'Fruit'
order by date;