Ejemplo de DAX desde el punto de vista del álgebra relacional / Sudo Null IT News

¡Hola Habr!

Existen muchas herramientas para resolver problemas de Business Intelligence; una de las herramientas convenientes es el lenguaje funcional DAX, que le permite trabajar con varios DBMS y realizar cálculos analíticos bastante complejos.

Dado que el lenguaje DAX es capaz de trabajar con muchos DBMS diferentes (por ejemplo, Oracle, MS SQL, MySQL, PostgreSQL, ClickHouse, etc.), es decir, funciona con muchos dialectos de SQL, entonces, en cierto sentido, DAX es un “superconjunto”. of SQL” y se acerca en este sentido al álgebra relacional. Este artículo analiza un DAX típico para obtener una representación de ese DAX en notación de álgebra relacional. Aquellos interesados ​​en sumergirse en DAX y su representación relacional son bienvenidos 🙂

Considere un esquema en estrella con una tabla de hechos con ventas Ventas, cuya fila contiene la clave de producto clave de producto, la clave de cliente clave de cliente y la cantidad vendida, cantidad, así como la tabla Producto (campos clave de producto y nombre de producto) y la tabla Cliente ( campos de clave de cliente y nombre de cliente).

Esquema de datos utilizado para DAX (dax.do)

Esquema de datos utilizado para DAX (dax.do)

DAX para obtener la suma del número de ventas agrupadas por nombre de producto y nombre de cliente se ve así (también este ejemplo está disponible en dax.do):

EVALUATE
SUMMARIZECOLUMNS (
    'Product'(Product Name),
    'Customer'(Customer Name),
    "Total Quantity", SUMX ( 'Sales', 'Sales'(Quantity) )
)

Este DAX utiliza el iterador SUMX para calcular la suma del campo 'Ventas' (Cantidad) dentro de una agrupación de 'Producto' (Nombre del producto) y 'Cliente' (Nombre del cliente).

Resultado de la ejecución de DAX en dax.do

Resultado de la ejecución de DAX en dax.do

Construyamos una representación relacional de este DAX. Seleccionemos la relación de ventas S, elemento s.i set S es una tupla de la clave de producto salesproductkeyila clave de cliente salescustomerkeyi y cantidad vendida cantidadi:

si ∈ S, si = (clave de producto de ventasiclave de cliente de ventasicantidadi)

También seleccionamos la relación de productos P, cuyo elemento es una tupla pi con clave de producto clavei y nombre del producto nombre del productoi:

pagi ∈ P, pi = (clave de productoinombre del productoi)

Finalmente, por analogía, seleccionamos la relación clientes C, cuyo elemento ci es una tupla de la clave customekeyi y el nombre del cliente nombre del clientei:

doi ∈ C, pagi = (clave de clienteinombre del clientei)

Existen variedades de notación de álgebra relacional. Este artículo utilizará el producto cartesiano ×, selección con fines ilustrativos. pagproyección pag y agregación con agrupación F Residencia en fuentepero, por supuesto, puede utilizar otras operaciones relacionales, por ejemplo, la operación JOIN, que se denota como ⋈ y se define mediante el producto cartesiano y la selección. Por ejemplo, para las ventas S y los productos P, la operación JOIN ⋈ se ve así:

S ⋈clave de producto de ventas = clave de producto pag = pagclave de producto de ventas = clave de producto (S×P)

Volviendo al DAX original y al problema original, el primer paso es identificar todos los registros de ventas según el esquema en estrella utilizando el producto cartesiano y la selección por condición de coincidencia clave:

pagclave de producto de ventas = clave de producto Y clave de cliente de ventas = clave de cliente ( S × P × C )

Por cierto, usando JOIN se vería así:

S ⋈ clave de producto de ventas = clave de producto PAG ⋈claveclienteventas = clavecliente do

A continuación haremos una proyección. pagpara seleccionar solo los campos necesarios nombre del producto, nombre del cliente y cantidad para una mayor agregación:

pag nombre del producto, nombre del cliente, cantidad (pagclave de producto de ventas = clave de producto Y clave de cliente de ventas = clave de cliente(S×P×C))

Finalmente, hagamos la agregación. F para obtener el resultado. A la izquierda de F Los campos para agrupar están escritos en el índice inferior y a la derecha de F en el índice inferior, los campos para agregación están escritos indicando la función de agregación, es decir, para agrupar por nombre_campo para_agrupación y para la suma nombre_campo_suma obtenemos un registro nombre_campo para_agrupación F SUM nombre_campo para_suma. Puede parecer algo engorroso, pero aun así, volviendo al problema original, obtenemos:

nombre del producto, nombre del cliente F cantidad SUMA (pag nombre del producto, nombre del cliente, cantidad (pagclave de producto de ventas = clave de producto Y clave de cliente de ventas = clave de cliente (S×P×C)))

Así, hemos obtenido una expresión de álgebra relacional correspondiente al DAX original.

Se puede observar que, a diferencia de los dialectos SQL, en DAX no influyemos explícitamente en los planes de ejecución de consultas, por ejemplo, especificando GROUP BY o seleccionando el tipo JOIN (INNER, LEFT SEMI y otros), o especificando una condición de filtro en la parte WHERE de la instrucción SELECT, o en la parte JOIN ON, no nos importan los índices, etc.

El tiempo de ejecución de DAX resuelve todos estos problemas de forma independiente (por ejemplo, a través de Autoexiste etc.). También vale la pena señalar que, además de la implementación DAX de Microsoft, también existe un producto nacional: Visiología.

Espero que el análisis anterior sea interesante o ayude a aclarar las características del lenguaje DAX 🙂

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *