从SQL窗口函数中排除分区?

时间:2017-07-11 13:20:19

标签: sql mariadb window-functions

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

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。我相信Columnstore的窗口函数在语法上类似于Amazon Redshift。

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

2 个答案:

答案 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 

答案 1 :(得分: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;