Bir tablodaki çeşitli boyutların yüzdelerini hesaplamam gerekir. Paydayı hesaplamak için pencere işlevlerini kullanarak işleri basitleştirmek isterim, ancak bir sorun yaşıyorum çünkü pay bir toplam da olması gerekiyor.Toplu bir yüzdesini hesaplamak için bir SQL pencere işlevi nasıl kullanılır?
Basit bir örnek olarak, aşağıdaki tabloyu almak: Sadece d1 dışına her satırın payını hesaplamak istiyorsanız
create temp table test (d1 text, d2 text, v numeric);
insert into test values ('a','x',5), ('a','y',5), ('a','y',10), ('b','x',20);
ardından pencereleme fonksiyonları iyi çalışır:
select d1, d2, v/sum(v) over (partition by d1)
from test;
"b";"x";1.00
"a";"x";0.25
"a";"y";0.25
"a";"y";0.50
Ancak, yapmam gereken şey d1'in d2'si için toplam paylaşımı hesaplamak.
ERROR: column "test.v" must appear in the GROUP BY clause or be used in an aggregate function
Bunun nedeni olduğunu varsayarak yaşıyorum: şimdi hata olsun, Ancak
select d1, d2, sum(v)/sum(v) over (partition by d1)
from test
group by d1, d2;
:
"b";"x";1.00
"a";"x";0.25
"a";"y";0.75
Yani bu deneyin: Aradığım çıktı şudur Gruplama fonksiyonunda pencere fonksiyonunun muhasebeleştirilmemesinden şikayetçi olmakla birlikte, pencereleme işlevleri zaten gruplama maddesine konamaz.
Bu, Postgresql 8.4'ün bir çatal olan Greenplum 4.1'i kullanıyor ve aynı pencereleme işlevlerini paylaşıyor. Greenplum'un ilişkili alt sorgular yapamayacağını unutmayın.
Ah harika! Ben de peşimdeydim. Mantıklı. Bu şeylerin hepsi bu kadar net değil. – EvilPuppetMaster
@erwinBrandsletter Hayatımı kurtardı! teşekkür ederim – isJustMe