Cálculos de inteligencia de tiempo adicionales
Hay otras funciones de inteligencia de tiempo de DAX que están relacionadas con la devolución de una sola fecha. En esta unidad, descubrirá estas funciones aplicándolas en dos escenarios diferentes.
Las funciones FIRSTDATE y LASTDATE devuelven la primera y la última fecha en el contexto de filtro actual para la columna de fechas especificada.
Cálculo de nuevos eventos
Otro uso de las funciones de inteligencia de tiempo es el recuento de nuevos eventos. 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 consiste en añadir la siguiente medida a la tabla Sales, que cuenta el número de clientes distintos hasta la fecha (ventas desde inicio). "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
Añada la medida Customers LTD al objeto visual de matriz. Como puede ver, genera un resultado de ventas desde inicio de clientes distintos hasta el final de cada mes.
La función DATESBETWEEN devuelve una tabla que contiene una columna de fechas que comienza con una fecha de inicio determinada y continúa hasta una fecha de finalización determinada. Cuando la fecha de inicio está en BLANK, se usa la primera fecha de la columna de fecha. (Por el contrario, cuando la fecha de finalización está en BLANK, usa la última fecha de la columna de fecha). En este caso, la fecha final la determina la función MAX, que devuelve la última fecha en el contexto del filtro. Por lo tanto, si el mes de agosto de 2017 está en un 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, modificará la medida renombrándola como New Customers y añadiendo una segunda variable para almacenar el recuento de distintos clientes antes del periodo de tiempo en el contexto del filtro. Ahora, la cláusula RETURN resta este valor de los clientes de ventas desde inicio para generar un resultado, que es el número de nuevos clientes en el periodo 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, la función DATESBETWEEN incluye fechas hasta la primera fecha del contexto de filtro menos una. Dado que Power BI almacena internamente las fechas como números, puede sumar o restar números para cambiar 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. En la tabla, se carga una instantánea de los valores 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 la fecha. Al añadir los recuentos de niveles de existencias en las distintas categorías de productos, se genera un resumen significativo, pero eso no ocurre al añadir recuentos de niveles de existencias en todas las fechas. Añadir el nivel de existencias de ayer al nivel de existencias de hoy no es una operación útil, 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 siguiente ejemplo, explorará un escenario para la empresa Adventure Works. Cambie a la vista de modelo y seleccione el diagrama de modelo Inventory.
Como puede ver, el diagrama muestra tres tablas: Product, Date e Inventory. La tabla Inventory almacena instantáneas de saldos de unidades para cada fecha y producto. Es importante mencionar que la tabla no contiene ninguna fecha faltante y que no hay ninguna entrada duplicada para productos 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. Añada 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. Añadir los saldos de instantáneas diarios no genera un resultado significativo. Por lo tanto, quite el campo UnitsBalance del objeto visual de matriz.
Ahora, añadirá una medida a la tabla Inventory que sume el valor de UnitsBalancepara una sola fecha. La fecha es la última fecha de cada periodo de tiempo. Se logra usando la función LASTDATE. Dé formato a la medida como un número entero mediante el separador de miles.
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTDATE('Date'[Date])
)
Nota
Como puede ver, 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 como solo hay una fila para cada producto y cada fecha, la función SUM solo funciona sobre una sola fila.
Añada la medida Stock on Hand al objeto visual de matriz. Ahora, el valor de cada producto se basa en el último saldo de unidades registrado para cada mes.
La medida devuelve valores BLANK para "June 2020" porque no existe ningún registro para la última fecha de junio. Según los datos, todavía no ha ocurrido.
Filtrar por la última fecha en el contexto del filtro comporta algunos problemas: es posible que no exista una fecha registrada porque aún no ha ocurrido o 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 sea BLANK y, luego, filtrar por esa fecha. Puede lograrlo con la función LASTNONBLANK.
Utilice la siguiente definición de medida para modificar la medida Stock on Hand.
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTNONBLANK(
'Date'[Date],
CALCULATE(SUM(Inventory[UnitsBalance]))
)
)
En el objeto visual de matriz, observe los valores para June 2020 y Total (que representa el año completo).
La función LASTNONBLANK es iteradora. Devuelve la última fecha que genera un resultado que no sea BLANK. Para conseguirlo, recorre en iteración todas las fechas del contexto de filtro en orden cronológico descendente. (Por el contrario, FIRSTNONBLANK recorre en iteración en orden cronológico ascendente). Para cada fecha, evalúa el recorrido en la expresión. Cuando encuentra un resultado que no sea 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. A fin de evaluar la expresión correctamente, se debe usar la función CALCULATE para hacer la transición del contexto de fila al contexto de filtro.
Ahora, debería ocultar la columna UnitsBalance en la tabla Inventory. Evita que los autores de informes resuman de forma inadecuada saldos de instantáneas de unidades.