Pedindo para um amigo que usa SQL Server Parallel Warehouse.
They™ tem uma tabela de valores de vendas semanais, assim (perdoe a justificativa imprópria da coluna):
+-------+------------+
| week | amount |
+-------+------------+
| 1 | 100.00 |
| 2 | 100.00 |
| 3 | 100.00 |
| 4 | 100.00 |
| 5 | 100000.00 |
| 6 | 100.00 |
| 7 | 50000.00 |
| 8 | 50000.00 |
| 9 | 50000.00 |
| 10 | 100.00 |
+-------+------------+
E também uma lista de semanas "ruins", por exemplo
+------+
| week |
+------+
| 5 |
| 7 |
| 8 |
| 9 |
+------+
E They™ precisa selecionar para cada semana, incluindo semanas "ruins", a soma das vendas das quatro semanas anteriores não "ruins" , ou seja, indo o mais longe possível, pulando registros de semanas "ruins", para somar no máximo quatro valores de vendas. Assim, o resultado esperado seria:
+-------+------------+
| week | sum_not_bad|
+-------+------------+
| 1 | null |
| 2 | 100.00 |
| 3 | 200.00 |
| 4 | 300.00 |
| 5 | 400.00 |
| 6 | 400.00 |
| 7 | 400.00 |
| 8 | 400.00 |
| 9 | 400.00 |
| 10 | 400.00 |
+-------+------------+
Eu tenho um violino que acho que um passo na direção certa, mas não consigo descobrir o(s) próximo(s) passo(s).
Alguém tem insights?
resultado
dbfiddle
Aqui está uma maneira, ele usa
PARTITION
para agrupar todas as boas semanas e obter a contagem cumulativa de boas para as 4 boas semanas anteriores. Em seguida, uma abordagem ao longo das linhas da Solução 2 Usando Concatenação aqui para contornar a falta de suporte paraLAST_VALUE
ignorar NULLs e cascata para baixo o valor "bom" anterior.Ele mantém o controle de duas somas cumulativas. Uma incluindo a linha atual (usada pela próxima linha se a linha "próxima" estiver ruim) e outra sem a linha atual.