Saya pikir Anda sedang mencari ini:
SELECT d1, d2, sum(v)/sum(sum(v)) OVER (PARTITION BY d1) AS share
FROM test
GROUP BY d1, d2;
Menghasilkan hasil yang diminta.
Fungsi jendela diterapkan setelah fungsi agregat. sum()
outer bagian luar di sum(sum(v)) OVER ...
adalah fungsi jendela (terlampir OVER ...
klausa) sedangkan bagian dalam sum()
adalah fungsi agregat.
Secara efektif sama dengan:
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;
Atau (tanpa 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;
Atau varian @Mu.
Selain:Greenplum memperkenalkan subquery yang berkorelasi dengan versi 4.2. Lihat catatan rilis.