Monday 20 November 2017

Moving Average In Sql


Estoy tratando de crear un promedio móvil en mi modelo. Buscando algo de ayuda. Traté de seguir los detalles en el blog de Alberto Ferraris aquí. Pero no podía conseguir la medida DayNumber trabajando, la sintaxis no parecía correcta y no podía corregirla. Mi modelo tiene una tabla de hechos que contiene una lista de casos, uniéndose a una tabla de fecha a través de la fecha creada. Tengo una segunda relación (inactiva) a la tabla de fecha en la columna ClosedDate. Tengo una medida: Caso cerrado Cuenta: CALCULAR (COUNTROWS (Caso), USERELATIONSHIP (CaseClosedDateKey, DateDateKey)). Me gustaría una medida para obtener la suma de Case Closed Count para los últimos tres días del contexto actual. Entonces planeo dividir ese número por 3 para obtener el promedio móvil de 3 días. Una otra pieza de lógica que me gustaría considerar - si el último día es HOY, entonces los 3 días anteriores se utilizan - los datos se actualizan cada 15 minutos, por lo que hacer esto a las 09:00 de la mañana se sesga el promedio, como No es un día completo. Cualquier ayuda es apreciada. Domingo, 17 de febrero de 2017 17:25 Respuestas Heres un enlace a un enfoque utilizando sólo una medida calculada que Javier Guillén escribió hace un tiempo. Espero que ayude. Brent Greenwood, MS, MCITP, CBIP // Por favor marque las respuestas correctas y los mensajes útiles // brentgreenwood. blogspot Editado por Brent Greenwood Editor lunes, 18 de febrero de 2017 16:08 Propuesto como respuesta por Ed Price - MSFT Microsoft employee, Owner Thursday , 22 de agosto de 2017 19:39 Marcado como respuesta por Ed Price - MSFT Empleado de Microsoft, Propietario Martes, 17 de septiembre de 2017 6:39 Lunes 18 de Febrero de 2017 16:08 En su puesto, Alberto hace uso de la Función EARLIER que devuelve un valor de un contexto de fila anterior. Esto sólo funciona en una expresión de iteración, cuando esta expresión se evalúa en un contexto de fila existente (una otra expresión iterativa o una columna calculada.) ¿Cumple el requisito (no probado)? Caso cerrado - Últimos 3 días: CALCULAR COUNTROWS (Caso) USERELATIONSHIP (CaseClosedDateKey, DateDateKey) DATESBETWEEN (DATEADD (DateDateKey, -3, Day) DateDateKey)) El último puede hacer con una expresión IF utilizando la función TODAY () y adaptar el patrón anterior. Enviado por Ed Price - MSFT Empleado de Microsoft, Propietario Jueves, 22 de Agosto de 2017 19:40 Lunes 18 de Febrero de 2017 11:51 Heres un enlace a un enfoque usando sólo una medida calculada que Javier Guillén escribió hace un tiempo . Espero que ayude. Brent Greenwood, MS, MCITP, CBIP // Por favor marque las respuestas correctas y los mensajes útiles // brentgreenwood. blogspot Editado por Brent Greenwood Editor lunes, 18 de febrero de 2017 16:08 Propuesto como respuesta por Ed Price - MSFT Microsoft employee, Owner Thursday , 22 de agosto de 2017 19:39 Marcado como respuesta por Ed Price - MSFT Empleado de Microsoft, Propietario Martes, 17 de septiembre de 2017 6:39 Lunes 18 de febrero de 2017 4:08 PMCómo calcular los promedios móviles en Excel Análisis de datos de Excel Para Dummies, 2nd Edition El comando Data Analysis proporciona una herramienta para calcular promedios móviles y exponencialmente suavizados en Excel. Supongamos, por razones ilustrativas, que usted ha recopilado información diaria sobre la temperatura. Desea calcular el promedio móvil de tres días 8212 el promedio de los últimos tres días 8212 como parte de algún pronóstico meteorológico simple. Para calcular las medias móviles para este conjunto de datos, siga estos pasos. Para calcular una media móvil, primero haga clic en el botón de comando Data Analysis (Análisis de datos) tab8217s. Cuando Excel muestra el cuadro de diálogo Análisis de datos, seleccione el elemento Promedio móvil de la lista y, a continuación, haga clic en Aceptar. Excel muestra el cuadro de diálogo Promedio móvil. Identifique los datos que desea utilizar para calcular el promedio móvil. Haga clic en el cuadro de texto Intervalo de entrada del cuadro de diálogo Promedio móvil. A continuación, identifique el intervalo de entrada, ya sea escribiendo una dirección de rango de hoja de cálculo o utilizando el mouse para seleccionar el rango de hoja de cálculo. Su referencia de rango debe usar direcciones de celdas absolutas. Una dirección de celda absoluta precede la letra de la columna y el número de fila con signos, como en A1: A10. Si la primera celda de su rango de entrada incluye una etiqueta de texto para identificar o describir sus datos, active la casilla de verificación Etiquetas en primera fila. En el cuadro de texto Intervalo, indique a Excel cuántos valores deben incluirse en el cálculo del promedio móvil. Puede calcular un promedio móvil usando cualquier número de valores. De forma predeterminada, Excel utiliza los tres valores más recientes para calcular el promedio móvil. Para especificar que se utilice otro número de valores para calcular el promedio móvil, ingrese ese valor en el cuadro de texto Intervalo. Dígale a Excel dónde colocar los datos del promedio móvil. Utilice el cuadro de texto Rango de salida para identificar el intervalo de hoja de cálculo en el que desea colocar los datos del promedio móvil. En el ejemplo de la hoja de cálculo, los datos del promedio móvil se han colocado en el rango B2 de la hoja de cálculo: B10. (Opcional) Especifique si desea un gráfico. Si desea un gráfico que trace la información del promedio móvil, seleccione la casilla de verificación Salida del gráfico. (Opcional) Indique si desea calcular la información de error estándar. Si desea calcular errores estándar para los datos, seleccione la casilla de verificación Estándar Errores. Excel coloca valores de error estándar junto a los valores de media móvil. (La información de error estándar pasa a C2: C10.) Una vez que haya terminado de especificar qué información del promedio móvil desea calcular y dónde desea colocarla, haga clic en Aceptar. Excel calcula la información del promedio móvil. Nota: Si Excel doesn8217t tiene suficiente información para calcular una media móvil para un error estándar, coloca el mensaje de error en la celda. Usted puede ver varias células que muestran este mensaje de error como un valor. En este post, muestro un truco para hacer el cálculo del promedio móvil (se puede ampliar a otras operaciones que requieren funciones de ventanas) que es muy rápido. A menudo, los analistas SAS necesitan realizar cálculos de promedio móvil y hay varias opciones por orden de preferencia: 1. PROC EXPAND 2. DATOS PASO 3. PROC SQL Pero muchos sitios no pueden licenciar SAS / ETS para usar PROC EXPAND y hacer el promedio móvil En DATA STEP requiere cierta codificación y es propenso a errores. PROC SQL es una opción natural para los programadores junior y en muchos casos empresariales la única solución, pero SAS PROCs SQL no tiene funciones de ventanas que están disponibles en muchos DB para facilitar el cálculo del promedio móvil. Una técnica que la gente suele utilizar es CROSS JOIN, que es muy costosa y no es una solución viable para un conjunto de datos de tamaño medio. En este post, muestro un truco para hacer cálculo de promedio móvil (se puede extender a otras operaciones que requieren funciones de ventana) que es súper rápido. Considere el cálculo de la media móvil más simple en el que las observaciones K de arrastrado se incluyen en el cálculo, a saber MA (K), aquí nos fijamos K5. En primer lugar, generar una muestra 20 obs datos, donde la variable ID se utiliza para la ventana y la variable X se va a utilizar en el cálculo de MA, y luego aplicar el CROSS JOIN estándar para examinar primero los datos resultantes, no agrupados, sólo Para entender cómo aprovechar la estructura de datos. A partir del conjunto de datos resultante, es difícil encontrar una pista, ahora vamos a ordenar por la columna quotbidquot en este conjunto de datos: De estos datos clasificados, está claro que en realidad no tenemos que CROSS JOIN el conjunto original de datos, sino que, Podemos generar un conjunto de datos de quotoperationquot que contiene el valor de diferencia y dejar que el conjunto de datos originales CROSS JOIN con este conjunto de datos quotoperationquot mucho más pequeño y todos los datos que necesitamos utilizar para el cálculo de MA estarán allí. Ahora vamos a hacerlo: CROSS JOIN datos originales con quotoperationquot datos, ordenar por (a. idops), que es en realidad quotbid39 en el conjunto de datos clasificados Tenga en cuenta que en el código anterior, es necesario tener ax multiplicar por b. weight para que los datos Puede ser entre hojas, de lo contrario se saldrá el mismo valor de X de la tabla original y se fallará el cálculo de MA. La variable de peso explícito añade realmente más flexibilidad al cálculo de MA completo. Si bien establecerlo como 1 para todos los obs resulta en un simple cálculo de MA, asignar pesos diferentes ayudará a resolver la computación MA más compleja, como dar más observaciones menos peso para una MA decaída. Si se requiere un parámetro K diferente en los cálculos de MA (K), solo se debe actualizar el conjunto de datos de la operación que es un trabajo trivial. Ahora la plantilla de código real para el cálculo de MA (K) será: Con este nuevo método, es interesante compararlo con el auto costoso CROSS JOIN así como con PROC EXPAND. En mi estación de trabajo (Intel i5 3.8Ghz, 32GB de memoria, 1TB 72K HDD), auto CROSS JOIN es prohibitivamente largo en tiempo de ejecución (si los datos son grandes), mientras que el nuevo método utiliza sólo 2X tanto tiempo como PROC EXPAND, ambos consumos de tiempo son Trivial comparando a uno mismo CROSS JOIN. El consumo de tiempo que se muestra a continuación es en quotsecondquot. Debajo están los lectores de código pueden funcionar y compararse. Publicado el 10 de mayo de 2017 por Liang Xie Programación SAS para Data MiningEstoy tratando de crear una función que calcula una media móvil en ventanas en SQLServer 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. Pruebe 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 El código de ejemplo en la pestaña Código completo ilustra cómo calcular El promedio móvil de una variable a través de un conjunto de datos completo, sobre las últimas N observaciones en un conjunto de datos, o sobre las últimas N observaciones dentro de un grupo BY. Estos ejemplos de archivos y ejemplos de código son proporcionados por SAS Institute Inc. como es sin garantía de ningún tipo, ya sea expresa o implícita, incluyendo pero no limitado a las garantías implícitas de comerciabilidad y aptitud para un propósito en particular. Los recipientes reconocen y aceptan que SAS Institute no será responsable de los daños y perjuicios derivados de su uso de este material. Además, el SAS Institute no proporcionará soporte para los materiales aquí contenidos. Estos ejemplos de archivos y ejemplos de código son proporcionados por SAS Institute Inc. como es sin garantía de ningún tipo, ya sea expresa o implícita, incluyendo pero no limitado a las garantías implícitas de comerciabilidad y aptitud para un propósito en particular. Los recipientes reconocen y aceptan que SAS Institute no será responsable de los daños y perjuicios derivados de su uso de este material. Además, el SAS Institute no proporcionará soporte para los materiales aquí contenidos. Calcular el promedio móvil de una variable a través de un conjunto completo de datos, sobre las últimas N observaciones en un conjunto de datos, o sobre las últimas N observaciones dentro de un grupo BY.

No comments:

Post a Comment