Saltar al contenido

T-SQL calcula el promedio móvil

Tenemos la mejor respuesta que hallamos online. Deseamos que te sea de ayuda y si deseas comentarnos algo que nos pueda ayudar a crecer siéntete libre de hacerlo..

Solución:

Las funciones de la ventana en SQL 2008 son bastante limitadas en comparación con las versiones posteriores y, si no recuerdo mal, solo puede particionar y no puede usar ningún límite de marco de filas/rango, pero creo que esto podría ser lo que desea:

;WITH cte (rn, transactionid, value) AS (
    SELECT 
       rn = ROW_NUMBER() OVER (ORDER BY transactionid),
       transactionid,
       value
    FROM your_table
)

SELECT 
    transactionid, 
    value, 
    movagv = (
        SELECT AVG(value) 
        FROM cte AS inner_ref
        -- average is calculated for 250 previous to current row inclusive
        -- I might have set the limit one row to large, maybe it should be 249
        WHERE inner_ref.rn BETWEEN outer_ref.rn-250 AND outer_ref.rn
        ) 
FROM cte AS outer_ref

Tenga en cuenta que aplica una subconsulta correlacionada a cada fila y es posible que el rendimiento no sea muy bueno.

Con las versiones posteriores, podría haber usado funciones de marco de ventana y hacer algo como esto:

SELECT 
    transactionid, 
    value,
    -- avg over the 250 rows counting from the previous row
    AVG(value) OVER (ORDER BY transactionid  
                     ROWS BETWEEN 251 PRECEDING AND 1 PRECEDING),
    -- or 250 rows counting from current
    AVG(value) OVER (ORDER BY transactionid  
                     ROWS BETWEEN 250 PRECEDING AND CURRENT ROW)
FROM your_table

Use una Expresión de tabla común (CTE) para incluir el número de fila de cada transacción, luego una la CTE contra sí misma en el número de fila para que pueda obtener los valores anteriores para calcular el promedio.

CREATE TABLE MyTable (TransactionId INT, Value INT)

;with Data as
(
  SELECT TransactionId, 
         Value, 
         ROW_NUMBER() OVER (ORDER BY TransactionId ASC) as rownum
  FROM MyTable
)
SELECT d.TransactionId , Avg(h.Value) as MovingAverage
FROM Data d
JOIN Data h on h.rownum between d.rownum-250 and d.rownum-1
GROUP BY d.TransactionId 

Recuerda compartir esta reseña si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *