es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Media móvil ponderada con particiones en SQL.

Tengo una tabla simple con las ventas de diferentes productos por fecha (YYYYMMDD). Hay muchos días y muchos productos. La tabla se ve así:

fecha       producto    ventas
...
20210101    Manzanas    112
20210101    Bananas     13
20210102    Manzanas    12
20210102    Bananas     101
20210103    Manzanas    18
20210103    Bananas     155
20210101    Limones     14
...

Necesito calcular un promedio móvil ponderado de 3 días para cada uno de los productos. Lo principal es la partición. Estoy tratando de incluirlo en este código:

SELECT table.date,
       max(table.sales) as sales,
       CASE 
       WHEN table.date - (select min(date) from table) >1
       THEN sum(weighting * ma_table.sales)
       END as WMA 
FROM table
JOIN table AS ma_table ON table.date - ma_table.date BETWEEN 0 AND 2
JOIN (SELECT id_1, 1/(2 + 1.) as weighting FROM (VALUES (0, 1, 2)) as t(id_1)) weights ON
  id_1 = table.date - ma_table.date
GROUP BY table.date
ORDER BY table.date

¿Hay algo que se pueda hacer con este código para incluir la partición allí?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puede incluir una cláusula PARTITION BY en su consulta para calcular el promedio móvil ponderado de 3 días para cada producto. La consulta se vería algo como esto:

    SELECT table.fecha,
           max(table.ventas) como ventas,
           CASE 
           WHEN table.fecha - (select min(fecha) from table) >1
           THEN sum(ponderación * ma_table.ventas)
           END como WMA 
    FROM table
    JOIN table AS ma_table ON table.fecha - ma_table.fecha BETWEEN 0 AND 2
    JOIN (SELECT id_1, 1/(2 + 1.) como ponderación FROM (VALUES (0, 1, 2)) como t(id_1)) pesos ON
      id_1 = table.fecha - ma_table.fecha
    PARTITION BY producto
    GROUP BY table.fecha
    ORDER BY table.fecha
    

Comments are closed.