Sunday, 1 October 2017

Moving Average Sql 2008


Promedio móvil en T-SQL Un cálculo común en el análisis de tendencias es el promedio móvil (o móvil). Un promedio móvil es el promedio de, por ejemplo, las últimas 10 filas. El promedio móvil muestra una curva más suave que los valores reales, más aún con un período más largo para el promedio móvil, lo que lo convierte en una buena herramienta para el análisis de tendencias. Esta publicación del blog mostrará cómo calcular el promedio móvil en T-SQL. Se utilizarán diferentes métodos dependiendo de la versión de SQL Server. El siguiente gráfico muestra el efecto de suavizado (línea roja) con un promedio móvil de 200 días. Las cotizaciones de acciones son la línea azul. La tendencia a largo plazo es claramente visible. T-SQL Moving Avergage 200 días La demostración a continuación requiere la base de datos TAdb que se puede crear con el script que se encuentra aquí. En el próximo ejemplo calcularemos un promedio móvil de los últimos 20 días. Dependiendo de la versión de SQL Server, habrá un método diferente para hacer el cálculo. Y, como veremos más adelante, las nuevas versiones de SQL Server tienen funciones que permiten un cálculo mucho más efectivo. SQL Server 2012 y posterior Moving Average Esta versión hace uso de una función de ventana agregada. Lo nuevo en SQL 2012 es la posibilidad de restringir el tamaño de la ventana especificando cuántas filas que preceden a la ventana deben contener: Las filas precedentes son 19, porque incluiremos la fila actual también en el cálculo. Como puede ver, el cálculo del promedio móvil en SQL Server 2012 es bastante simple. La siguiente figura muestra el principio de ventana. La fila actual está marcada con amarillo. La ventana está marcada con un fondo azul. El promedio móvil es simplemente el promedio de QuoteClose en las líneas azules: T-SQL Moving average window. Los resultados de los cálculos en versiones anteriores de SQL Server son iguales, por lo que no se mostrarán de nuevo. SQL Server 2005 8211 2008R2 Moving Average Esta versión hace uso de una expresión de tabla común. El CTE es auto referenciado para obtener las últimas 20 filas para cada fila: Promedio móvil antes de SQL Server 2005 La versión anterior a 2005 utilizará una combinación externa izquierda en la misma tabla para obtener las últimas 20 filas. Comparación de rendimiento Si ejecutamos los tres métodos diferentes simultáneamente y comprobamos el plan de ejecución resultante, hay una diferencia dramática en el rendimiento entre los métodos: Comparación de tres Diferentes métodos para calcular el promedio móvil Como puede ver, las mejoras de la función de ventana en SQL 2012 hacen una gran diferencia en el rendimiento. Uso Como se mencionó en el comienzo de este post, las medias móviles se utilizan como una herramienta para ilustrar las tendencias. Un enfoque común es combinar promedios móviles de diferentes longitudes, con el fin de detectar cambios en las tendencias a corto, mediano y largo plazo, respectivamente. De particular interés son el cruce de líneas de tendencia. Por ejemplo, cuando la tendencia corta se mueve sobre la tendencia larga o media, esto puede interpretarse como una señal de compra en el análisis técnico. Y cuando la tendencia corta se mueve bajo una línea de tendencia más larga, esto puede interpretarse como una señal de venta. El siguiente gráfico muestra Cotizaciones, Ma20, Ma50 y Ma200. T-SQL Ma20, Ma50, Ma200 comprar y vender señales. Esta entrada del blog forma parte de una serie sobre análisis técnico, TA, en SQL Server. Vea los otros mensajes aquí. Publicado por Tomas Lind Estoy tratando de crear una función que calcula un promedio móvil con ventanas en SQL Server 2008. Soy absolutamente nuevo a SQL así que estoy teniendo un pedacito justo de dificultad. Los datos que estoy tratando de realizar la media móvil en las necesidades de ser agrupados por día (que es todos los datos de fecha y hora) y, a continuación, una variable ventana de media móvil debe aplicarse a ella. Ya tengo una función que agrupa los datos por día (e id) que se muestra en la parte inferior. Tengo algunas preguntas: ¿Sería mejor llamar a la función de agrupación dentro de la función de media móvil o debo hacerlo todo a la vez Es posible obtener la media móvil para las fechas de entrada en la función, pero volver n días a Comenzar el promedio móvil de modo que los primeros n días de los datos devueltos no tendrán 0 para su promedio (es decir, si quieren un promedio móvil de 7 días del 01-08-2011 al 02-08-2011 que empiezo el promedio móvil Cálculo en 01-01-2011 para que el primer día que se define tiene un valor) Estoy en el proceso de buscar en cómo hacer el promedio móvil y saber que una ventana en movimiento parece ser la mejor opción (currentSum prevSum todayCount - NthDayAgoCount) / nDays, pero todavía estoy trabajando en averiguar la implementación de SQL de este. Tengo una función de agrupación que se parece a esto (algunas variables eliminadas para fines de visibilidad): Que devuelve una tabla como así: EDIT: Para responder a la primera pregunta que he hecho: Terminé creando una función que declaró una tabla temporal e insertó los resultados A partir de la función de contar en él, a continuación, utiliza el ejemplo de user662852 para calcular el promedio móvil. Tome el rango de fechas de fecha fija de su consulta. Escriba la salida (como su muestra al final) a una tabla temporal (lo llamé visitas más abajo). Intente este uno mismo ensambla a la tabla de la temperatura: EDIT: No tuve bastante sitio en comentarios para decir esto en respuesta a su pregunta: Mi unión es un poco cartesiana porque utiliza un entre en la restricción de la ensambladura. Cada registro en la lista va contra todos los demás registros, y luego quiero los que la fecha que informe es entre un límite inferior de (-7) días y hoy. Cada fecha de datos está disponible para enumerar la fecha, ésta es la llave a su pregunta. Podría haber escrito la condición de unión como Pero lo que realmente ocurrió fue que lo probé como que no devuelve registros porque la sintaxis es entre LOW y HIGH. Me enfrenté a los 0 registros y cambié los argumentos, eso es todo. Intente lo siguiente, vea lo que quiero decir: Esta es la combinación cartesiana para sólo una lista: Compare esto con la condición de unión real Ver cómo la fecha de la lista está entre datadate y dataplus6 en todos los registros Estoy trabajando con SQL Server 2008 R2, Un promedio móvil. Para cada registro en mi vista, me gustaría recopilar los valores de los 250 registros anteriores, y luego calcular el promedio para esta selección. Mis columnas de vista son las siguientes: TransactionID es único. Para cada TransactionID. Me gustaría calcular el promedio para el valor de la columna, más de 250 registros anteriores. Así para TransactionID 300, recopile todos los valores de 250 filas anteriores (la vista se clasifica descendiendo por TransactionID) y luego en la columna MovAvg escriba el resultado del promedio de estos valores. Estoy buscando para recopilar datos dentro de un rango de registros. Cómo se calcula un promedio móvil de SQL sin una actualización de cursor: Si está trabajando con las versiones más recientes de SQL Server, puede utilizar las funciones de ventana para lograr lo mismo. He publicado el código actualizado al final de la publicación. Para este video, todavía me gusta el proceso de pensamiento de anclaje a una fecha. Video: Promedio móvil de 3 días en SQL Una manera eficiente de calcular una media móvil en SQL usando algunos trucos para establecer anclas de fecha. Hay debates sobre la mejor manera de hacer un SQL Moving Average en SQL Server. Algunas personas piensan que hay momentos en que un cursor es más eficiente. Otros piensan que puedes hacerlo todo de una manera basada en un set sin el cursor. El otro día iba a calcular una media móvil y mi primer pensamiento fue utilizar un cursor. Hice algunas investigaciones rápidas y encontré esta pregunta del foro: Promedio móvil en TSQL Hay una publicación que muestra una subconsulta con una fecha de anclaje para ayudar a encontrar el desplazamiento de 1 y 2 días. Aquí está el script que puede usar para probar el resultado final de SQL Moving Average de 3 días. Aquí está la consulta final. Aquí está la consulta que usted utilizaría con SQL Server 2012. Comparta esto: No consigo la respuesta perfecta la vez pasada y todavía estoy trabajando en la salida exacta que necesito. Tengo las dos columnas enteras en mi tabla y tengo que calcular promedios para esas dos columnas. De ahí mi salida debe ser fecha col1 col2 AVGcol1 AVGcol2 y el promedio de cada fila debe ser avg (valor de la fecha actual y la suma de la última cinco fecha ). En este caso tengo más de una fila para una sola fecha. Eso también necesita ser considerado. Gracias por adelantado. Lunes, 29 de diciembre de 2017 7:09 PM Todas las respuestas En serio, no está claro qué es exactamente lo que está viendo Heres una nueva sugerencia utilizando sus datos de muestra anteriores para calcular el promedio de n dos maneras diferentes No está seguro si está mirando a cualquiera de estos o algo más A menos que nos proporcione datos de muestra adecuados para imitar todo su escenario, sólo podemos seguir adivinando. Lunes, 29 de diciembre de 2017 a las 7:27 PM echa un vistazo al thread de stackoverflow quotT-SQL calcular el promedio móvil. Creo que esta es la respuesta. Lunes, 29 de diciembre de 2017 7:35 PM Gracias Visakh por su respuesta. Aquí está el código que estoy viendo .. puede por favor ejecutar el siguiente código. DECLARE myTable TABLE (myDate FECHA, PressureValue SMALLINT, PressureValue1 int) INSERT INTO myTable SELECT 12/10/2017, 250.200 UNION TODOS SELECT 12/21/2017, 100,100 UNION TODOS SELECT 12/21/2017, 150,300 UNION ALL SELECT 12/21 / 2017, 100,100 UNION ALL SELECT 12/22/2017, 150,300 UNION TODOS SELECT 12/23/2017, 100,100 UNION TODOS SELECT 12/23/2017, 150,300 UNION TODOS SELECT 12/24/2017, 100,100 UNION ALL SELECT 12/24 / 2017, 150,300 UNION ALL SELECT 12/25/2017, 200,450 CON CTE AS (SELECT, dENSErANK () Más (ORDER BY myDate) Como RowNo FROM myTable) SELECT MainQry. myDate, MainQry. PressureValue, AVG (SubQry. PressureValue) AS AVGPressureValue, MainQry. PressureValue1, AVG (SubQry. PressureValue1) AS InkoAVGPressureValue1 DESDE CTE Como MainQry EXTERIOR EXTERIOR CINE COMO SubQry En SubQry. RowNo gt MainQry. RowNo - 2 Y SubQry. RowNo lt MainQry. RowNo GROUP BY MainQry. myDate, MainQry. Valor de presión, MainQry. PressureValue1, MainQry. RowNo ORDER BY MainQry. myDate Veo los promedios mal .. puede por favor ayudarme a conseguir que sean correctos Lunes 29 de diciembre de 2017 7:36 PM Por favor, siga la Netiquette básica y publique el DDL que necesitamos contesta esto. Siga la industria y los estándares ANSI / ISO en sus datos. Debe seguir las normas ISO-11179 para nombrar elementos de datos. Debe seguir las normas ISO-8601 para mostrar datos temporales. Necesitamos conocer los tipos de datos, las claves y las restricciones de la tabla. Evite el dialecto a favor de ANSI / ISO Standard SQL. Y usted necesita leer y descargar el PDF para: www. simple-talk / books / sql-books / 119-sql-code-smells / gtgt No obtuve la respuesta perfecta la última vez y todavía estoy trabajando en la salida exacta Que yo necesito. Ltlt Tal vez usted podría considerar la publicación de DDL y darnos la fecha de la muestra, por lo que podemos hacer su trabajo para usted gtgt Tengo las dos columnas enteras en mi tabla y tengo que calcular promedios para esas dos columnas. Por lo tanto mi salida debe ser somethingdate, col1, col2, col1avg, col2avg y el promedio de cada fila debe ser avg (valor de la fecha actual y la suma de las cinco últimas fechas). En este caso tengo más de una fila para una sola fecha. Eso también tiene que ser considerado. Podría haber adivinado que la fecha genérica era la clave, pero su relato dice que no es así. Lástima que no tengamos idea de cuál podría ser la clave. Lástima que no tengamos idea de NULLs, o bien ¿Por qué tuvimos que casi torturarte para conseguir algo? Sólo darnos DDL al principio. CREATE TABLE Garbage (fecha de publicación DATE NOT NULL, col1 INTEGER NOT NULL, col2 INTEGER NOT NULL, PRIMARY KEY (.)) INSERTAR EN Garbage VALUES (2017-12-10, 250, 200), (2017-12-21, 100, 100), (2017 - 12 - 22, 150, 300), (2017 - 12 - 21, 100, 100) , (2017 - 12 - 24, 150, 300), (2017 - 12 - 24, 100, 100), (2017 - Mi suposición: resumir cada días de contabilización en G2. Ahora t34eh fecha podría ser una clave A continuación, utilice G2 con una cláusula de Windows para obtener las anteriores 5 filas. Eso no es exactamente lo mismo que los cinco días previos. Sin embargo, si tenemos lagunas. La opción RANGE no funciona completamente en T-SQL, pero podríamos hacer una unión externa a una tabla de calendario y algunos otros trucos. Con G2 (postingdate, col1, col2) AS (SELECT postingdate, SUM (col1), SUM (col2) DE Garbage GRUPO BY postingdate) SELECT postingdate, col1, AVG (col1 1.00) OVER (ORDER BY postingdate ROWS ENTRE 5 PRECEDING AND ACTUAL COL), col2, AVG (col2 1.00) OVER (ORDER BY postingdate FILAS ENTRE 5 PREDIALES Y ACTUALES FILAS) AS col2avg FROM G2 --CELKO-- Libros de la serie Celko para Morgan-Kaufmann Publishing: Analytics y OLAP en SQL / Datos y Bases de Datos: Conceptos en Práctica Datos / Medidas y Estándares en SQL SQL para Smarties / SQL Estilo de Programación / SQL Puzzles y Respuestas / Pensando en Conjuntos / Árboles y Jerarquías en SQL Monday, December 29, 2017 10:58 PM En cuanto a su descripción, Su requisito suena como abajo a mí. Si mi comprensión está bien, como usted mencionó que wouldnt como la solución con APPLY en su último hilo de un requisito similar, aunque el camino por APPLY sería elegante, por favor, consulte la siguiente solución. Si tiene alguna pregunta, no dude en hacérmelo saber. Saludos cordiales, Eric Zhang Editado por EricZhang Personal contingente de Microsoft, Moderador domingo, 04 de enero de 2017 14:32 Marcado como respuesta Abhinav530 Martes, 06 de enero de 2017 4:09 Sin marcar como respuesta Abhinav530 Martes 06 de Enero de 2017 4 : 09 PM viernes, 02 de enero 2017 7:44 AM

No comments:

Post a Comment