2017-07-11 8 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を使用しています。 Columnstoreのウィンドウ関数はAmazon Redshiftと構文的に似ていると私は思う。

avg_prod_rev_oth_custは、「この顧客を除いたこの製品の収益の合計/他の顧客からの売上数で割ったもの」として計算する必要があります。最初の出現:(3 + 4 + 5 + 6)/ 4。

+3

どのように 'avg_prod_rev_oth_cust'計算する必要がありますか? –

+0

@vkpが述べたように、この計算がどのように機能するかをより詳しく説明してください。また、DDLステートメントとサンプルデータを使用可能な形式で提供してください。 SQL Fiddle(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; 
関連する問題