2017-07-11 30 views
0

我的目标是计算排除当前分区的平均值。在下表中,我想知道如何生成avg_prod_rev_oth_cust列:其他客户的平均产品收入。这可以通过窗口功能来完成吗?从SQL窗口函数中排除分区?

cust prod rev avg_prod_rev avg_prod_rev_oth_cust 
a  x 1   3.5   4.5 
a  x 2   3.5   4.5 
b  x 3   3.5   3.5 
b  x 4   3.5   3.5 
c  x 5   3.5   2.5 
c  x 6   3.5   2.5 
a  y 7   9.5  10.5 
a  y 8   9.5  10.5 
b  y 9   9.5   9.5 
b  y 10   9.5   9.5 
c  y 11   9.5   8.5 
c  y 12   9.5   8.5 

我使用MariaDB的列存储。我相信Columnstore的窗口函数在语法上类似于Amazon Redshift。

avg_prod_rev_oth_cust应该计算为“该产品的收入不包括该客户/除以其他客户的销售数量之和”。第一次出现:(3 + 4 + 5 + 6)/ 4。

+3

应该如何'avg_prod_rev_oth_cust'计算? –

+0

正如@vkp所提到的,请详细解释这个计算应该如何工作。另外,请以可用的形式提供DDL语句和示例数据,例如作为一个SQL小提琴(请参阅http://www.sqlfiddle.com) –

+0

它也可以帮助我们回答,如果你知道你正在使用什么数据库... –

回答

1

你可以用self joinavg窗口函数来做到这一点。

select distinct t1.*,avg(t2.rev) over(partition by t1.prod,t1.rev) as avg_prod_rev_oth_cust 
from tbl t1 
join tbl t2 on t1.prod=t2.prod 
where t1.cust<>t2.cust 
+0

嗯,我没有想到我使用MDB Columnstore的事实会很重要,但显然它确实如此。 MCS是有限的,只允许'='连接,所以我不能使用'<>'部分。这看起来很不错,谢谢! – GGGforce

+1

您可以使用它作为'where'条件。 –

+0

使用它在哪里!谢谢。 – GGGforce

0

无窗功能(所以,没有真正回答这个问题):

SELECT cus, 
     AVG(rev) AS AvgAll, 
     (SELECT AVG(rev) AS AvgOther 
      FROM ws_test 
      WHERE cus != t1.cus 
     ) AS AvgOther 
    FROM ws_test AS t1 
    GROUP BY cus;