Eu tenho uma visão que calcula a soma contínua tomando o valor da linha anterior com base na PARTITION BY
cláusula e preciso indicar que um campo na PARTITION BY
cláusula pode ter nulos.
sum(s."QuantityChange") OVER (PARTITION BY s."LocationId", s."PartId", s."SupplierFacilityId" ORDER BY s."DueDate" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS "RunningSum"
Às vezes SupplierFacilityId
é nulo e tudo bem, ainda deve ser incluído no sum()
cálculo.
Isso é possível com o Postgres?
Sua imagem do comentário (que deve ser texto na pergunta ) mostra que você executa a consulta com esta
WHERE
cláusula:Então você pode simplesmente largar
"SupplierFacilityId"
paraPARTITION BY
conseguir o que deseja: linhas com"SupplierFacilityId" IS NULL
são tratadas como pares iguais da partição:Além disso, como a opção de enquadramento padrão é
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
, e supondo que(s."LocationId", s."PartId", s."DueDate")
seja definida como única (o que tornaRANGE
eROWS
equivalente neste contexto), você pode simplesmente descartar as opções de enquadramento personalizadas:Sem essa
WHERE
cláusula, seu objetivo seria inatingível com uma função de janela simples, pois você teria que usar as mesmas linhas com valores NULL em várias partições. Você teria que multiplicar essas linhas primeiro ...Como o ypercube mencionado nos comentários, ele ainda deve funcionar mesmo quando o
SupplierFacilityId
é nulo. Mas se você estiver enfrentando problemas ou quiser forçá-lo a usar um valor específico como padrão, poderá usar aCOALESCE()
função para substituir oNULL
valor por outra coisa.De acordo com seus comentários atualizados, aqui está um exemplo de consulta que usa uma
CASE
instrução simples para alcançar a lógica da sua imagem: