テーブルがあります:
key product_code cost
1 UK 20
1 US 10
1 EU 5
2 UK 3
2 EU 6
「キー」の各グループのすべての製品の合計を見つけて、各行に追加したいと思います。たとえば、キー= 1の場合、すべての製品のコストの合計(20 + 10 + 5 = 35)を見つけ、キー= 1に対応するすべての行に結果を追加します。したがって、結果は次のようになります。
key product_code cost total_costs
1 UK 20 35
1 US 10 35
1 EU 5 35
2 UK 3 9
2 EU 6 9
これは非効率であるため、サブ結合を使用せずにこれを実行することをお勧めします。私の最良のアイデアは、over
関数をsum
関数と組み合わせて使用することですが、機能させることができません。私の最善の努力:
SELECT key, product_code, sum(costs) over(PARTITION BY key)
FROM test
GROUP BY key, product_code;
Ivは docs を調べましたが、非常に不可解なので、それを行う方法を理解する方法がわかりません。私はHive v0.12.0、HDP v2.0.6、HortonWorks Hadoopディストリビューションを使用しています。
@VB_と同様に、BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
ステートメント 。
したがって、HiveQLクエリは次のとおりです。
SELECT key, product_code,
SUM(costs) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM test;
BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
は、自己結合なしでそれを実現します。
以下のコード:
SELECT a, SUM(b) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM T;
分析関数の合計は、累積合計を提供します。たとえば、次の場合:
select key, product_code, cost, sum(cost) over (partition by key) as total_costs from test
それからあなたは得るでしょう:
key product_code cost total_costs
1 UK 20 20
1 US 10 30
1 EU 5 35
2 UK 3 3
2 EU 6 9
どうやらそれはあなたが望むものではないようです。
代わりに、これを達成するために、自己結合と組み合わせて集計関数sumを使用する必要があります。
select test.key, test.product_code, test.cost, agg.total_cost
from (
select key, sum(cost) as total_cost
from test
group by key
) agg
join test
on agg.key = test.key;
このクエリは私に完璧な結果を与えます
select key, product_code, cost, sum(cost) over (partition by key) as total_costs from zone;
上の表は次のようでした
key product_code cost
1 UK 20
1 US 10
1 EU 5
2 UK 3
2 EU 6
ユーザーは、次のような合計コストを記載した表を求めていました。
key product_code cost total_costs
1 UK 20 35
1 US 10 35
1 EU 5 35
2 UK 3 9
2 EU 6 9
そのため、次のクエリを使用しました
SELECT key, product_code,
SUM(costs) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM test;
ここまでは順調ですね。各国の出来事を数え、コラムをもっと欲しい
key product_code cost total_costs occurences
1 UK 20 35 2
1 US 10 35 1
1 EU 5 35 2
2 UK 3 9 2
2 EU 6 9 2
そのため、次のクエリを使用しました
SELECT key, product_code,
SUM(costs) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as total_costs
COUNT(product code) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as occurences
FROM test;
悲しいことに、これは機能していません。不可解なエラーが発生します。クエリのエラーを除外するには、何か間違ったことをしたかどうかを確認します。ありがとう
同様の答え(Oracle empテーブルを使用する場合):
select deptno, ename, sal, sum(sal) over(partition by deptno) from emp;
出力は以下のようになります:
deptno ename sal sum_window_0
10 MILLER 1300 8750
10 KING 5000 8750
10 CLARK 2450 8750
20 SCOTT 3000 10875
20 FORD 3000 10875
20 ADAMS 1100 10875
20 JONES 2975 10875
20 SMITH 800 10875
30 BLAKE 2850 9400
30 MARTIN 1250 9400
30 ALLEN 1600 9400
30 WARD 1250 9400
30 TURNER 1500 9400
30 JAMES 950 9400