Cálculos de inteligencia de tiempo adicionales
Existen otras funciones de inteligencia de tiempo de DAX que están relacionadas con la devolución de una sola fecha. Para aprender sobre estas funciones, las aplicará en dos escenarios distintos.
Las funciones FIRSTDATE
y LASTDATE
de DAX devuelven la primera y la última fecha del contexto de filtro actual para la columna de fechas especificada.
Cálculo de repeticiones nuevas
Otro uso de las funciones de inteligencia de tiempo es el recuento de repeticiones nuevas. En el ejemplo siguiente se muestra cómo puede calcular el número de clientes nuevos durante un período de tiempo. Un cliente nuevo se cuenta en el período de tiempo en el que hizo la primera compra.
La primera tarea es agregar la medida siguiente a la tabla Sales que cuenta el número de cálculos hasta la fecha (LTD) de clientes distintos. "Hasta la fecha" se refiere a desde el comienzo del período de tiempo hasta la última fecha en el contexto de filtro. Dé formato a la medida como un número entero mediante el separador de miles.
Customers LTD =
VAR CustomersLTD =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MAX('Date'[Date])
),
'Sales Order'[Channel] = "Internet"
)
RETURN
CustomersLTD
Agregue la medida Customers LTD (LTD de clientes) al objeto visual de matriz. Observe que genera un resultado de LTD de clientes distintos hasta el final de cada mes.
La función DATESBETWEEN
devuelve una tabla que contiene una columna de fechas que empieza con una fecha de inicio determinada y sigue hasta una fecha de finalización concreta. Cuando la fecha de inicio es BLANK, usará la primera fecha de la columna de fecha. (Por el contrario, cuando la fecha de finalización es BLANK, usará la última fecha de la columna de fecha). En este caso, la fecha de finalización viene determinada por la función MAX, que devuelve la última fecha en el contexto de filtro. Por lo tanto, si el mes de agosto de 2017 está en el contexto de filtro, la función MAX devolverá el 31 de agosto de 2017 y la función DATESBETWEEN
devolverá todas las fechas hasta el 31 de agosto de 2017.
A continuación, para modificar la medida, cámbiele el nombre a New Customers (Clientes nuevos) y agregue una segunda variable para almacenar el recuento de distintos clientes antes del período de tiempo en el contexto de filtro. La cláusula RETURN
ahora resta este valor de los clientes LTD para generar un resultado, que es el número de clientes nuevos en el período de tiempo.
New Customers =
VAR CustomersLTD =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MAX('Date'[Date])
),
'Sales Order'[Channel] = "Internet"
)
VAR CustomersPrior =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MIN('Date'[Date]) - 1
),
'Sales Order'[Channel] = "Internet"
)
RETURN
CustomersLTD - CustomersPrior
Para la variable CustomersPrior, observe que la función DATESBETWEEN
incluye fechas hasta la primera fecha del contexto de filtro menos uno. Como Microsoft Power BI almacena de manera interna las fechas como números, puede sumar o restar números para desplazar una fecha.
Cálculos de instantáneas
En ocasiones, los datos de hechos se almacenan como instantáneas en el tiempo. Algunos ejemplos comunes son los niveles de existencias del inventario o los saldos de cuentas. Una instantánea de los valores se carga en la tabla de manera periódica.
Al resumir los valores de las instantáneas (como los niveles de existencias del inventario), puede resumir los valores en cualquier dimensión excepto Date. Agregar los recuentos de niveles de existencias en las distintas categorías de productos genera un resumen significativo, pero agregar recuentos de niveles de existencias en todas las fechas no lo hace. Agregar el nivel de existencias de ayer al nivel de existencias de hoy no es una operación que resulte útil de realizar (a menos que quiera calcular el promedio de ese resultado).
Al resumir las tablas de instantáneas, las fórmulas de medida pueden basarse en las funciones de inteligencia de tiempo de DAX para aplicar un filtro de fecha único.
En el ejemplo siguiente, explorará un escenario para la empresa Adventure Works. Cambie a la vista de modelo y seleccione el diagrama de modelo Inventory (Inventario).
Observe que en el diagrama se muestran tres tablas: Product, Date e Inventory. La tabla Inventory almacena instantáneas de saldos de unidad para cada fecha y producto. Es importante mencionar que la tabla no contiene ninguna fecha faltante y ninguna entrada duplicada para ningún producto en la misma fecha. Además, el último registro de instantáneas se almacena para la fecha del 15 de junio de 2020.
Ahora, cambie a la vista de informe y seleccione la Página 2 del informe. Agregue la columna UnitsBalance de la tabla Inventory al objeto visual de matriz. Su resumen predeterminado se establece en sumar valores.
Esta configuración visual es un ejemplo de cómo no resumir un valor de instantánea. Agregar los saldos de instantáneas diarios no genera un resultado significativo. Por lo tanto, quite el campo UnitsBalance desde el objeto visual de matriz.
Ahora, agregará una medida a la tabla Inventory que suma el valor UnitsBalancepara una fecha única. La fecha será la última fecha de cada período de tiempo. Se logra mediante la función LASTDATE
. Dé formato a la medida como un número entero con el separador de miles.
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTDATE('Date'[Date])
)
Nota
Observe que la fórmula de medida usa la función SUM
. Se debe usar una función de agregado (las medidas no permiten referencias directas a las columnas), pero dado que solo existe una fila para cada producto para cada fecha, la función SUM
solo funcionará sobre una sola fila.
Agregue la medida Stock on Hand (Existencias disponibles) al objeto visual de matriz. El valor de cada producto ahora se basa en el último saldo de unidades registrado para cada mes.
La medida devuelve valores BLANK para junio de 2020 porque no existe ningún registro para la última fecha de junio. En función de los datos, todavía no ha ocurrido.
El filtrado por la última fecha en el contexto de filtro tiene problemas inherentes: Es posible que no exista una fecha registrada porque todavía no se ha producido o quizás porque los saldos de existencias no se registran los fines de semana.
El paso siguiente consiste en ajustar la fórmula de medida para determinar la última fecha con un resultado que no es BLANK y, luego, filtrar por esa fecha. Puede realizar esta tarea si usa la función LASTNONBLANK
de DAX.
Use la definición de medida siguiente para modificar la medida Stock on Hand (Existencias disponibles).
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTNONBLANK(
'Date'[Date],
CALCULATE(SUM(Inventory[UnitsBalance]))
)
)
En el objeto visual de matriz, observe los valores para junio de 2020 y el total (que representa el año completo).
La función LASTNONBLANK
es una función del iterador. Devuelve la última fecha que genera un resultado que no es BLANK. Este resultado lo consigue al recorrer en iteración todas las fechas del contexto de filtro en orden cronológico descendente. (Por el contrario, la función FIRSTNONBLANK
se recorre en iteración en orden cronológico ascendente). Para cada fecha, evalúa la expresión pasada. Cuando encuentra un resultado que no es BLANK, la función devuelva la fecha. Esa fecha se usa para filtrar la función CALCULATE
.
Nota
La función LASTNONBLANK
evalúa su expresión en el contexto de fila. La función CALCULATE
se debe usar para realizar la transición del contexto de fila al contexto de filtro para evaluar correctamente la expresión.
Ahora debe ocultar la tabla Inventory, columna UnitsBalance. Evitará que los creadores de los informes resuman de manera incorrecta los saldos de unidades de instantáneas.