Funciones MDX para series temporales

Por Celia Barbeyto
Consultor Open Source en OpenSistemas

Los cubos OLAP son un elemento imprescindible en Business Intelligence para realizar análisis de datos multidimensionales. MDX es el lenguaje de consultas para cubos OLAP, la estructura en general es algo similar al lenguaje SQL, en el sentido de que está conformado por una parte de selección de la información, otra parte de especificación del origen de la información y una última parte de la especificación de las condiciones de filtrado. Además, el lenguaje MDX contiene una gran cantidad de funciones orientadas a entornos de datos multidimensionales.

Un tipo de funciones que me parecen muy interesantes de MDX son las series temporales, que están especialmente diseñadas para generar estadística descriptiva de datos en el tiempo. Por ejemplo, nos ofrece la posibilidad de comparar un mes con ese mismo mes en años anteriores, el trimestre con el mismo trimestre de años anteriores y así con todos los niveles de tiempo que tengamos disponibles en el cubo.

Algunas de las funciones de series temporales muy útiles y prácticas son las YTD (Year To Date), MTD (Month To Date), QTD (Quarter To Date) y WTD (Weak To Date). Se trata de un conjunto de funciones conocidas como las xTD y con ellas podemos hacer cálculos que solo incluyan los datos de un período específico. Una fórmula utilizando esta función sería, por ejemplo:

Aggregate(YTD([Time].CurrentMember), [Measures].[gasto])

La fórmula anterior crea un miembro calculado que hace un agregado de los datos de forma anual, es decir, suma solo entre meses del mismo año, no acumula entre años distintos, la misma lógica se aplica a las demás funciones xTD. La salida de la fórmula de ejemplo sería la siguiente:

cubos

Otras funciones interesantes para series temporales son PARALLELPERIOD, PERIODSTODATE, CLOSINGPERIOD y OPENINGPERIOD. PARALLELPERIOD permite obtener los datos de un período en la misma posición del período anterior, por ejemplo, los valores del mismo mes para años anteriores:

([Measures].[gasto], PARALLELPERIOD([Time].[Mes], [Time].CURRENTMEMBER))

Las funciones CLOSINGPERIOD y OPENINGPERIOD tienen la misma sintaxis y básicamente devuelven el primer o último elemento de un período. Pueden utilizarse múltiples funciones a la vez, dependiendo de las necesidades de cálculo, pueden combinarse con las clásicas funciones matemáticas como SUM, AVG, AGGREGATE, COUNT, MAX, MIN, etc… funciones lógicas como IIF, ISEMPTY, por ejemplo:

AVG([Time].[Month].CurrentMember.Lag(3):[Time].[Month].CurrentMember.Lag(1),[Measures].[Ingresos])

En la fórmula anterior se utiliza la función AVG para sacar un promedio y la función LAG para indicar miembros hacia atrás. Por tanto, en este ejemplo estamos calculando la media de los ingresos en los tres meses anteriores al mes de consulta o, bien si estamos viendo el trimestre, la media de los tres trimestres anteriores, y así con cada nivel de la dimensión de tiempo.

Conocer las principales funciones MDX y pasarse de vez en cuando por el catálogo de funciones disponibles, nos dará la sorpresa de encontrar alguna función que nos facilite todo el trabajo. A través de diversas combinaciones se puede llegar al mismo resultado y no nos debemos complicar con expresiones demasiados elaboradas, pues posiblemente exista una sola función que resuelva nuestro problema. Menos es más y obtendremos una solución más elegante, así que el tiempo que nos tome definir miembros calculados dependerá de cuántas funciones conozcamos y cuánta imaginación le echemos.