Necesito calcular porcentajes de varias dimensiones en una tabla. Me gustaría simplificar las cosas mediante el uso de funciones de ventana para calcular el denominador, sin embargo, estoy teniendo un problema porque el numerador tiene que ser un agregado también.Cómo usar una función de ventana SQL para calcular un porcentaje de un agregado
Como un simple ejemplo, adoptar la siguiente tabla:
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);
Si sólo quiero calcular la cuota de cada fila individual de d1, funciones luego de ventanas funcionan bien:
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
Sin embargo, lo que tengo que hacer es calcular la cuota total para la suma de d2 de d1. La salida Busco es la siguiente:
"b";"x";1.00
"a";"x";0.25
"a";"y";0.75
así que intento esto:
select d1, d2, sum(v)/sum(v) over (partition by d1)
from test
group by d1, d2;
Sin embargo, ahora me sale un error:
ERROR: column "test.v" must appear in the GROUP BY clause or be used in an aggregate function
Estoy suponiendo que esto se debe a se queja de que la función de ventana no se tiene en cuenta en la cláusula de agrupación, sin embargo, las funciones de ventana no se pueden poner en la cláusula de agrupación de todos modos.
Esto está utilizando Greenplum 4.1, que es una bifurcación de Postgresql 8.4 y comparte las mismas funciones de ventana. Tenga en cuenta que Greenplum no puede hacer subconsultas correlacionadas.
¡Ah genial! Eso es lo que buscaba. Tiene sentido. Los documentos no son tan claros en esto. – EvilPuppetMaster
@erwinBrandsletter ¡Salvó mi vida! Gracias – isJustMe