あなたはこれを探していると思います:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
要求された結果を生成します。
ウィンドウ関数は後に適用されます 集計関数。外側のsum()
sum(sum(v)) OVER ...
で はウィンドウ関数です(添付のOVER ...
句)内部のsum()
は集計関数です。
実質的に同じ:
WITH x AS (
SELECT d1, d2, sum(v) AS sv
FROM test
GROUP BY d1, d2
)
SELECT d1, d2, sv/sum(sv) OVER (PARTITION BY d1) AS share
FROM x;
または(CTEなし):
SELECT d1, d2, sv/sum(sv) OVER (PARTITION BY d1) AS share
FROM (
SELECT d1, d2, sum(v) AS sv
FROM test
GROUP BY d1, d2
) x;
または@Muのバリアント。
余談ですが、Greenplumはバージョン4.2で相関サブクエリを導入しました。 リリースノートを参照してください。