Replicación de cada fila de una tabla un número aleatorio de veces

En este escenario partimos de una tabla ("Products") de productos identificados por números enteros consecutivos:

Tabla con los registros a replicar un número aleatorio de veces

El objetivo es generar otra tabla en la que cada uno de estos registros se haya replicado un número aleatorio de veces. Como puede apreciarse, este escenario es semejante al de Replicación de cada fila de una tabla según una tabla de valores con la salvedad de que ahora no tenemos una tabla que nos indique el número de veces que deberemos replicar cada fila. Pero la idea es semejante: en este caso generaremos la columna conteniendo esos números aleatorios manteniendo el esquema de trabajo que vimos en el escenario mencionado.

Esta columna de números aleatorios la vamos a añadir a las columnas existentes de la tabla Products utilizando el siguiente código:

Products_Extended = 
    ADDCOLUMNS(
        Products;
        "RandomValue"; RANDBETWEEN(2; 3)
    )

Tabla de productos conteniendo la columna adicional con los valores aleatorios

Queremos ahora realizar una combinación cruzada entre la tabla anterior y una segunda tabla con tantas filas como indique el valor de RandomValue que vemos en la imagen anterior (el contenido exacto de dichas filas es irrelevante: lo importante es que contenga el número correcto de filas para que la combinación cruzada "replique" cada fila de la primera tabla el número de veces indicado por el valor generado aleatoriamente). La función a utilizar para realizar la combinación cruzada es GENERATE, y la función para generar la tabla con el número que nos interesa de filas es GENERATESERIES. El código completo es el siguiente:

Products_Extended = 
    VAR
        Random = 
        ADDCOLUMNS(
            Products;
            "RandomValue"; RANDBETWEEN(2; 3)
        )
    RETURN
        GENERATE(
            Random;
            GENERATESERIES(1; [RandomValue])
        )

Hemos generado la tabla Random conteniendo los mismos campos que la tabla Products añadiéndole la columna con los valores aleatorios, y se devuelve la combinación cruzada de dicha tabla con la progresión aritmética generada por GENERATESERIES, indicando que deberán generarse [RandomValue] valores (cifra accesible vía contexto de fila para cada fila de la tabla Random para la que la función GENERATE se plantea la combinación cruzada). El resultado es el siguiente:

Tabla generada

Obsérvese que la máquina DAX no reconoce el campo RandomValue en el editor de fórmulas, pese a lo cual lo interpreta correctamente. Esto significa que hemos de escribir dicha etiqueta a mano en el código, sin esperar que el sistema "Intellisense" del editor nos lo muestre en la lista de opciones disponibles.

Funciones DAX involucradas
Enviado por admin el Dom, 14/07/2019 - 10:56