Función INDEX
La función INDEX devuelve una fila específica de una tabla, según su posición absoluta. Esta tabla se especifica en el parámetro Relación. La fila se selecciona dentro de una partición, que se ordena según las instrucciones que se hayan indicado.
Sintaxis:
1 | INDEX ( 2 | Posicion, 3 | [Relacion], 4 | [Ordenado Por], 5 | [Espacios en Blanco], 6 | [Particionado Por], 7 | [Coincidencia Por], 8 | [Restablecr] 9 | )
Parámetro | Atributo | Descripción |
---|---|---|
Posición | Un número entero, positivo o negativo, indica la fila que se va a devolver. La tabla, definida en el parámetro Relación, se determina respetando el contexto de evaluación regional y se numera de 1 a n desde la primera fila. También se puede numerar en sentido inverso, comenzando desde la última fila con -1 y continuando hasta -n para la primera fila. | |
Relación | Opcional | La tabla de la que se devolverá una fila, puede ser una referencia a una tabla existente en el modelo o una expresión de tipo tabla creada respetando el contexto de filtro original. Para devolver una fila específica, la tabla debe estar ordenada, ya sea de forma implícita (de manera que se distinga cada fila de forma única gracias a ese orden, utilizando un algoritmo interno que es determinista pero no documentado), o de manera explícita, según se especifique en el parámetro Ordenar Por para las columnas de la tabla.
• El parámetro Relación es opcional. Si se omite, es obligatorio especificar el parámetro Ordenar Por. |
Ordenado Por | Opcional | La tabla en el parámetro Relación debe estar ordenada para poder identificar cada fila de forma única. Para ello, se puede usar el parámetro Ordenar Por para especificar cómo deben ordenarse la tabla y sus particiones.
• Si se omite Ordenar Por, el parámetro Relación debe definirse obligatoriamente. • El orden por defecto será el de cada columna en el parámetro Relación. |
Espacios en Blanco | Opcional | Es una enumeración que determina cómo se manejan los valores en blanco al momento de ordenar, los valores admisibles son: KEEP, DEFAULT, FIRST y LAST. |
Particionado Por | Opcional | La cláusula PARTITIONBY permite especificar columnas para definir cómo se divide la tabla en Relación para su evaluación.
• Si se omite este parámetro, la tabla en Relación se considera como una sola partición. |
Coincidencia Por | Opcional | Columnas que definen cómo se identifica la fila actual mediante la cláusula MATCHBY. |
Restablecer | Opcional | Define cuándo se reinicia el cálculo mientras se está realizando el recorrido en la matriz visual. Las enumeraciones son: NONE, LOWESTPARENT, HIGHESTPARENT o un entero. |
• Valor que Retorna
La función INDEX devuelve una fila en una posición absoluta dentro de una partición. Si la partición contiene una sola fila, se toma esa única fila; si la partición tiene varias partes, se seleccionan múltiples filas gracias a la semántica aplicada..
• Ejemplos
Ejemplo 1: Parámetro de Posición, Relación y Ordenado Por
Para el modelo de DISPRODUCTOS L.D encontramos una matriz con el campo Año en el área de filas y la medida IngresosTot en el área de Valores. Crear una medida que señale la variación respecto al primer mes del año para los ingresos. Una posible solución utilizando la función INDEX es como sigue:
1 | VariacionDeIngresosRespectoAlPrimerMesDelAn = 2 | VAR IngresosActual = 3 | SUM ( Pedidos[Ingresos] ) 4 | VAR IngresoPrimerMesDelAn = 5 | CALCULATE ( 6 | SUM ( Pedidos[Ingresos] ), 7 | INDEX ( 8 | 4, 9 | ALLSELECTED ( Fechas[Mes] ),10 | ORDERBY ( Fechas[Mes], ASC )11 | ),12 | REMOVEFILTERS ( Fechas[MesNumero], Fechas[Trimestre] )13 | )14 | VAR Variacion = 15 | DIVIDE ( IngresosActual - IngresoPrimerMesDelAn, IngresoPrimerMesDelAn )16 | RETURN17 | Variacion
Dado que INDEX utiliza en su parámetro Ordenar Por la misma columna que en el parámetro Relación, es decir, Fechas[Mes], podríamos omitir el parámetro Relación, dejando la parte de INDEX de la siguiente manera:
1 | = INDEX ( 4, ORDERBY ( Fechas[Mes], ASC ) )
Esto es así porque si no se define el parámetro Relación, el valor predeterminado es la función ALLSELECTED, aplicada a todas las columnas especificadas en Ordenar Por y Particionar Por.
Ejemplo 2: Parámetro de Particionado Por y Espacios en Blanco
Para la misma matriz del ejemplo 1: Crear una medida que señale la variación respecto al promedio del primer mes de cada trimestre del año. Una posible solución utilizando la función INDEX es como sigue::
1 | CambioDeIngresosRespectoAlPromedioDelPrimerMesDeCadaTrimestre = 2 | VAR IngresosActual = 3 | SUM ( Pedidos[Ingresos] ) 4 | VAR IngresoPromedioPrimerMesPorTrimestre = 5 | CALCULATE ( 6 | SUM ( Pedidos[Ingresos] ) / 4, 7 | CALCULATETABLE ( 8 | INDEX ( 9 | 1,10 | ALLSELECTED ( Fechas[Trimestre], Fechas[Mes], Fechas[MesNumero] ),11 | ORDERBY ( Fechas[Trimestre], ASC, Fechas[MesNumero], ASC ),12 | ,13 | PARTITIONBY ( Fechas[Trimestre] )14 | ),15 | ALLEXCEPT ( Fechas, Fechas[Ano] )16 | )17 | )18 | VAR Variacion = 19 | DIVIDE ( IngresosActual - IngresoPromedioPrimerMesPorTrimestre, IngresoPromedioPrimerMesPorTrimestre )20 | RETURN21 | Variacion
Ejemplo 3: Parámetro Coincidencia Por
Para el modelo de DISPRODUCTOS L.D encontramos la tabla de dimensión SKUProductos y en ella queremos crear una columna calculada que siempre devuelva el segundo SKU de la tabla utilizando la función INDEX. Una solución directa es:
1 | SKU_Posicion2 = 2 | SELECTCOLUMNS (3 | INDEX ( 2, SKUProductos ),4 | "@SKU",5 | SKUProductos[SKU]6 | )
No obstante, retorna el siguiente error:
Debido a la Semántica Aplicada, concretamente en el proceso de Matching del algoritmo, este utiliza todas las columnas de la tabla especificada en el parámetro Relación para determinar la(s) fila(s) actual(es). Esto incluye la columna calculada que se está creando, pero dado que esta columna aún no está completamente definida y es necesaria para su propia creación, se genera una dependencia circular.
Sobre Semántica Aplicada
La semántica aplicada es el mecanismo que utilizan las funciones de ventana en DAX para identificar la fila o filas actuales en la tabla de origen (especificada en el parámetro ‘Relación’). Este proceso tiene dos fases principales: matching (coincidencia) y apply (aplicación).La utilidad de la semántica aplicada se hace mucho más evidente cuando pensamos en referencias relativas a la fila actual, como la siguiente o la anterior, y no en posiciones absolutas, como es el caso de la función INDEX. Por ello, para entender y ver más detalles sobre este tema, te recomiendo consultar la ficha técnica de la función OFFSET en el lenguaje DAX. La utilidad de la semántica aplicada se hace mucho más evidente cuando pensamos en referencias relativas a la fila actual, como la siguiente o la anterior, y no en posiciones absolutas, como es el caso de la función INDEX. Por ello, para entender y ver más detalles sobre este tema, te recomiendo consultar la ficha técnica de la función OFFSET en el lenguaje DAX. Ahora bien, al ser INDEX una función derivada, necesariamente aplica la semántica relativa, ya que forma parte de su naturaleza conocer la fila actual, incluso si la fila deseada está en una posición absoluta. Por esta razón, es la semántica aplicada, junto con el propio mecanismo de las columnas calculadas, la responsable de la dependencia circular..
Es posible gestionar el algoritmo de coincidencia mediante el modificador MATCHBY, ya que es factible especificar un conjunto de columnas del modelo de la tabla fuente (parámetro Relación), limitando la búsqueda de la fila actual solo a estas columnas.
Conociendo lo previo, si limitamos con el modificador MATHCBY solo a la columna SKU, se resolverá el problema de dependencia circular, ya que la semántica aplicada no estará llamando a la columna que se está creando. En otras palabras, la solución es como sigue:
1 | SKU_Posicion2_Corregido = 2 | SELECTCOLUMNS (3 | INDEX ( 2, SKUProductos, MATCHBY ( SKUProductos[SKU] ) ),4 | "@SKU",5 | SKUProductos[SKU]6 | )
Ejemplo 4: Parámetro Restablecer
Para el modelo de DISPRODUCTOS L.D encontramos una matriz con el campo Año en el área de filas y la medida IngresosTot en el área de Valores. Crear un cálculo visual que siempre devuelva el ingreso del primer mes del trimestre utilizando la función INDEX. Una posible solución es como sigue:
1 | IngresoDelPrimerMesEnElTrimestre_CalculoVisual = 2 | SELECTCOLUMNS ( -- SELECTCOLUMNS para devolver un solo valor 3 | INDEX ( 4 | 1, 5 | ROWS, 6 | , -- Argumento Ordenar Por 7 | , -- Argumento Espacios en Blanco 8 | , -- Argumento Particionado Por 9 | , -- Argumento Coincidencia Por10 | 2 -- Argumento Restablecer en su version numero entero11 | ),12 | "@Ing",13 | [Ingresos Tot]14 | )
El parámetro Restablecer requiere especificar un Eje, que es un elemento clave en la creación de tablas virtuales para cálculos visuales. Por eso, los ejemplos se centran en estos tipos de cálculos..
Los parámetros Ordenar Por, Espacios en Blanco, Participar Por y Conciencia Por se incluyeron en el código DAX anterior para ilustrar el uso correcto del parámetro Restablecer y evitar confusiones. Sin embargo, si no se utilizan estos parámetros, se aplicarán las opciones predeterminadas. En ese caso, la expresión puede simplificarse de la siguiente manera:
1 | IngresoDelPrimerMesEnElTrimestre_CalculoVisual = 2 | SELECTCOLUMNS (3 | INDEX ( 1, ROWS, 2 ),4 | "@Ing",5 | [Ingresos Tot]6 | )
• Recursos de Aprendizaje
Funciones de Ventana en Lenguaje DAX: Seminario que brinda un primer vistazo a la funciones de ventana en Lenguaje DAX, incluyendo la función INDEX.
» Ver Vídeo
Introducción a Cálculos Visuales en Lenguaje DAX: Los Cálculos Visuales en Lenguaje DAX introducen una dimensión innovadora al interactuar con los datos directamente desde una interfaz visual, en lugar de operar a través del modelo subyacente. Esta evolución representa un hito en DAX, al ser el primer enfoque de su tipo que enriquece el lenguaje con una gama ampliada de funciones y conceptos. Similar a la importancia de comprender el contexto de fila, el contexto de filtro y la transición de contexto en los cálculos tradicionales, dominar la orientación del análisis —incluyendo el manejo del eje y la capacidad de reinicio— es fundamental en el ámbito de los Cálculos Visuales.
• Bibliografía
+ Documentación en DAX.Guide »
+ Documentación de Microsoft »
Las cartas y fichas técnicas DAX de Power Elite Studio, LLC. & SAS es un proyecto inspirado en Dax.Guide del equipo de SQLBI y la documentación de Microsoft para el Lenguaje DAX.
★★★★★