Thursday 29 December 2016

Consulta Del Promedio Móvil Del Servidor Sql

Promedio móvil exponencial en T-SQL Las medias móviles exponenciales son similares a las medias móviles ponderadas, ya que asignan menos peso a los cambios hace mucho tiempo, y más peso a los cambios recientes. Las medias móviles ponderadas son lineales, pero las medias móviles exponenciales son exponenciales. Es decir, el peso puede expresarse como una curva: hay una gran manera de calcular promedios móviles exponenciales en T-SQL utilizando una característica indocumentada sobre variables y totales en ejecución en SQL Server. En este post de blog voy a mostrar cómo usar ese método para calcular el promedio móvil exponencial en T-SQL, pero también voy a presentar un método que está utilizando las características estándar de SQL Server. Desafortunadamente, eso significa usar un bucle. En los ejemplos calcularé una media móvil exponencial de 9 días. Los ejemplos utilizan la base de datos TAdb. Un script para crear TAdb se puede encontrar aquí. Media móvil exponencial (EMA): Método de los totales corrientes La teoría detrás de las características totales corrientes en las actualizaciones es descrita en detalle por Jeff Moden en su artículo Resolviendo los Problemas de Total de Riesgo y Orden Ordinario. Otros recursos que describen el uso de este método para calcular EMA son el blog Calculando promedios móviles con T-SQL por Gabriel Priester y el foro post Exponential Moving Average Challenge. Tanto en SQL Server Central. Básicamente, en T-SQL puede actualizar variables así como columnas en una instrucción de actualización. Las actualizaciones se realizan fila por fila internamente por SQL Server. Este comportamiento fila por fila es lo que hace posible calcular un total en ejecución. Este ejemplo muestra cómo funciona: Tenga en cuenta que 8220ColumnRunningTotal8221 es un total de 8220ColumnToSum8221. Usando este método podemos calcular EMA9 con este T-SQL: El cálculo de EMA es bastante simple. Utilizamos la fila actual y la anterior, pero con más peso a la fila actual. El peso se calcula mediante la fórmula 2 / (19), donde 822098221 es el parámetro para la longitud de la EMA. Para calcular EMA9 para la fila 10, el cálculo es: En este caso, la fila actual obtiene 20 del peso (2 / (19) 0,2) y la fila anterior obtiene 80 del peso (1-2 / (19) 0.8) . Encontrará este cálculo en la instrucción anterior en la instrucción CASE: EMM (Exponential Moving Average): método de bucle En la medida en que yo sepa, excepto para el método de totales de ejecución descrito anteriormente, no hay forma de calcular EMA utilizando una sentencia SQL basada en conjuntos . Por lo tanto, el T-SQL a continuación utiliza un bucle while para calcular EMA9: Los resultados son los mismos que en el ejemplo de totales en ejecución anterior. Rendimiento Como era de esperar, la versión basada en conjuntos de ejecución de totales es mucho más rápida que la versión de bucle. En mi máquina la solución basada del sistema era cerca de 300 ms, comparada a cerca de 1200 con la versión del lazo. Sin embargo, la versión de bucle se ajusta más a los estándares SQL. Así que la elección entre los métodos depende de lo que es más importante para usted, el rendimiento o los estándares. Uso El promedio móvil exponencial se puede utilizar en el análisis de tendencias, al igual que con los otros tipos de promedios móviles, Promedio móvil simple (SMA) y Promedio móvil ponderado (WMA). También hay otros cálculos en el análisis técnico que utiliza la EMA, MACD por ejemplo. 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 Tomas Lind - Servicios de consultoría como SQL Server DBA y desarrollador de bases de datos en High Coast Database Solutions AB. Estoy trabajando con SQL Server 2008 R2, tratando de calcular una media 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. Pidió Oct 28 14 a las 20: 58Esta es una pregunta de Evergreen Joe Celko. Ignoro qué plataforma de DBMS se utiliza. Pero en cualquier caso Joe fue capaz de responder hace más de 10 años con SQL estándar. Joe Celko SQL Puzzles y Respuestas citation: Ese último intento de actualización sugiere que podríamos usar el predicado para construir una consulta que nos daría una media móvil: ¿Es la columna extra o el enfoque de consulta mejor? La consulta es técnicamente mejor porque el enfoque UPDATE Desnormalizar la base de datos. Sin embargo, si los datos históricos que se están registrando no van a cambiar y el cálculo de la media móvil es caro, podría considerar el uso de la columna. SQL consulta de rompecabezas: por todos los medios uniforme. Usted acaba de tirar al cubo de peso apropiado dependiendo de la distancia desde el punto de tiempo actual. Por ejemplo quottake weight1 para datapoints dentro de 24hrs de datapoint actual weight0.5 para datapoints dentro de 48hrsquot. Ese caso importa cuántos puntos de datos consecutivos (como 6:12 am y 11:48 pm) están distantes entre sí. Un caso de uso que puedo pensar sería un intento de suavizar el histograma dondequiera que los puntos de datos no sean lo suficientemente densos. 22:22 No estoy seguro de que su resultado esperado (salida) muestra clásico simple móvil (rolling) promedio de 3 días. Porque, por ejemplo, el primer triple de números por definición da: pero esperas 4.360 y su confusión. Sin embargo, sugiero la siguiente solución, que utiliza la función de ventana AVG. Este enfoque es mucho más eficiente (claro y menos uso de recursos) que SELF-JOIN introducido en otras respuestas (y estoy sorprendido de que nadie ha dado una mejor solución). Verá que AVG está envuelto con el caso cuando rownum gt p. days entonces para forzar NULL s en las primeras filas, donde el promedio móvil de 3 días no tiene sentido. Respondió 23 de febrero a las 13:12 Podemos aplicar Joe Celkos sucia izquierda método de unión externa (como citado por Diego Scaravaggi) para responder a la pregunta como se le preguntó. Genera la salida solicitada: respondió Jan 9 at 0:33 Su respuesta 2016 Stack Exchange, Inc


No comments:

Post a Comment