Tenho uma tabela Cliente com um conjunto de dados como abaixo:
ID do cliente | Data do pedido | Tipo de pedido | Valor_Original |
---|---|---|---|
UM | 01/01/2025 | Volume | 10 |
UM | 02/01/2025 | Individual | 20 |
B | 03/01/2025 | Volume | 30 |
B | 03/01/2025 | Individual | 10 |
C | 04/01/2025 | Volume | 0 |
C | 04/01/2025 | Individual | 5 |
C | 04/01/2025 | Outro | 8 |
Preciso calcular a nova coluna (Adj_Value) com base em OrderDate para o cliente.
caso 1) quando OrderDate é diferente para um cliente, Adj_Value é o mesmo que Orig_Value, por exemplo: CustID = A (no conjunto de dados acima)
caso 2) quando OrderDate é o mesmo para um cliente em um grupo de registros, Adj_Value tem que ser calculado com base em OrderType = Bulk, quando Orig_Value não é nulo para OrderType = Bulk Por exemplo: CustID = B (no conjunto de dados acima)
caso 3) quando OrderDate é o mesmo para um cliente em um grupo de registros, Adj_Value tem que ser calculado com base em OrderType = Individual, quando Orig_Value é nulo para OrderType = Bulk Por exemplo: CustID = C (no conjunto de dados acima)
Observação: OrderType = "Bulk" tem preferência quando não é nulo, então "Individual" e depois "Other".
Aqui está a saída esperada com o novo campo - "Adj_Value":
ID do cliente | Data do pedido | Tipo de pedido | Valor_Original | Valor_Ajustável |
---|---|---|---|---|
UM | 01/01/2025 | Volume | 10 | 10 |
UM | 02/01/2025 | Individual | 20 | 20 |
B | 03/01/2025 | Volume | 30 | 30 |
B | 03/01/2025 | Individual | 10 | 30 |
C | 04/01/2025 | Volume | 0 | 5 |
C | 04/01/2025 | Individual | 5 | 5 |
C | 04/01/2025 | Outro | 8 | 5 |
Tentei com funções de janela SQL, mas não está me dando o resultado esperado:
Não consigo adicionar a consulta sql aqui: Anexei a captura de tela da consulta. Por favor, verifique aqui
Você pode calcular por valores de função de janela
bulk_orig_value
,individual_orig_value
,other_orig_value
com (partição por CustID, OrderDate).
Em seguida, use
coalesce
com a regraOrderType = "Bulk" gets preference when it is not null then "Individual" then "Other"
como coalesce(Bulk_Orig_Value, Individual_Orig_value, Other_Orig_Value) Adj_Value
Para ignorar valores 0, use
nullif(Orig_Value,0)
- null se Orig_Value=0.violino
Com dados de teste como
Basta usar as funções de agregação da janela min/max.
Seus dados não têm valores nulos, Orig_Value é zero para custID:C; então presumi que você quis dizer que zeros devem ser tratados como nulos?
edite para corrigir o caso
D
.muito parecido com outras respostas, mas mostrando o funcionamento desconstruído e usando NULLIFZERO para ser mais explícito
usando um CTE apenas para os dados de exemplo.
dá:
e pode então ser comprimido para: