Comportamiento de la función de ventana sum() en Redshift.
Estoy intentando usar SUM() de Redshift y funciones de ventana para realizar una suma acumulativa. Mis datos se ven así:
ID | item_date | item_count |
---|---|---|
12 | 01/01/2019 | 11 |
12 | 02/01/2019 | 8 |
12 | 03/01/2019 | 0 |
12 | 04/01/2019 | 5 |
12 | 05/01/2019 | 21 |
12 | 06/01/2019 | 0 |
Actualmente, mi suma se ve así:
SUM(item_count) over (partition by ID order by item_date rows unbounded preceding) as cumulative_count
Pero produce esta salida:
ID | item_date | item_count | cumulative_count |
---|---|---|---|
12 | 01/01/2019 | 11 | 11 |
12 | 02/01/2019 | 8 | 19 |
12 | 03/01/2019 | 0 | 0 |
12 | 04/01/2019 | 5 | 24 |
12 | 05/01/2019 | 21 | 45 |
12 | 06/01/2019 | 0 | 0 |
El comportamiento es correcto, EXCEPTO cuando item_count = 0. Obviamente, mi salida deseada sería:
ID | item_date | item_count | cumulative_count |
---|---|---|---|
12 | 01/01/2019 | 11 | 11 |
12 | 02/01/2019 | 8 | 19 |
12 | 03/01/2019 | 0 | 19 |
12 | 04/01/2019 | 5 | 24 |
12 | 05/01/2019 | 21 | 45 |
12 | 06/01/2019 | 0 | 45 |
He investigado el uso de la función LAST_VALUE() como una forma de rellenar los valores cero, pero en Redshift no se pueden anidar funciones de ventana.
¿Alguien ha visto esto antes?
davy.ai
Sí, este es un comportamiento conocido en Redshift cuando se utilizan funciones de ventana con SUM(). Cuando se encuentra un valor cero, la suma acumulativa dejará de aumentar hasta que se encuentre un valor distinto de cero. Una solución alternativa es utilizar una cláusula CASE para reemplazar los valores cero por NULL, lo cual no afectará al cálculo de la suma acumulativa:
Esto producirá la salida deseada donde la suma acumulativa continúa después de encontrar un valor cero.