Vista del historial basado en la segmentación: valor inicial / último, número de cambios

Un usuario Pregunto ✅

aburrido

Estoy tratando de representar los cambios de fecha (de una tabla de historial) durante un período de tiempo que puede especificar el usuario. Me gustaría poder mostrar no solo la cantidad de cambios que se han producido en el período de tiempo, sino también el valor original de ese período de tiempo y cuál es el último valor (también en ese período).

Aunque los datos de entrada están actualmente formateados así, puedo modificar el formato si me lleva más lejos:

change_id record_id change_field valor antiguo nuevo valor fecha_de_cambio
12345 2 B 13/4/17 20/4/17 21/6/16 22:14:43
12346 1 B 21/05/16 21/6/16 21/6/16 21:16:47
12347 1 B 21/6/16 21/7/16 21/6/16 21:31:35
12348 1 A 17/09/15 24/9/15 18/7/16 16:42:33
12349 2 B 20/4/17 1/4/17 29/11/16 19:15:25
12350 2 B 1/4/17 30/6/17 15/12/16 20:15:59
12351 2 B 30/6/17 19/10/17 31/1/17 23:40:10
12352 2 A 14/4/16 1/4/17 31/1/17 23:44:15
12353 2 A 1/4/17 4/4/17 14/03/17 00:35:43
12354 2 A 4/4/17 11/4/17 20/3/17 15:15:30
12355 2 B 19/10/17 12/10/17 8/6/17 17:51:10
12356 2 B 12/10/17 26/10/17 17/7/17 20:58:30
12357 2 B 26/10/17 16/03/18 16/8/17 22:15:00
12358 2 B 16/03/18 19/4/18 9/10/17 19:36:18

Si esto fuera SQL puro (a través de SSRS, o algo así), puedo usar un par de funciones de ventana y resultados derivados para clasificar / filtrar / etc.fácilmente los resultados en cada ejecución. Pero esto es Power BI y DAX.

Idealmente, cuando el usuario selecciona / modifica el rango de fechas (en este caso, he actuado como si hubiera seleccionado el 1/6/2016 al 1/6/2017), podría obtener resultados como este:

record_id change_field valor inicial último_valor cambios_total
1 A 17/09/15 24/9/15 1
2 A 14/4/16 11/4/17 3
1 B 21/05/16 21/7/16 2
2 B 30/6/17 20/4/17 4

Ni siquiera sé si es posible hacer algo como esto sobre la marcha en Power BI. He jugado con la configuración de rangos de fechas fijos, y solo dejando que el usuario seleccione uno de esos (lo que me permitiría hacer trampa y podría precalcular los resultados, y luego hacer que el filtro visual haga referencia a los resultados del rango precalculado). Pero esa es una segunda opción distante en mi mente: me encantaría que el usuario seleccionara dinámicamente el rango que desee. Ideas? ¿Ayudar? ¡Gracias por adelantado!

@longbored,

¿Utiliza el campo change_date para crear una segmentación y seleccionar el intervalo de fechas (1/6 / 2016- 1/6/2017) en la segmentación para obtener el resultado esperado? Si es así, parece que ingresó initial_value y latest_value incorrectos para el último registro (record_id = 2 y change_field = B). Creo las siguientes medidas en la tabla y obtengo el resultado como se muestra en la captura de pantalla a continuación.

valor_inicial = MIN (Tabla1[old_value])
último_valor = MAX (Tabla1[new_value])
cambios totales = CALCULATE (COUNTROWS (Table1), ALLEXCEPT (Table1, Table1[record_id],Tabla 1[change_field],Tabla 1[change_date]))
1.JPG

Saludos,
Lydia

aburrido

En respuesta a v-yuezhe-msft

Lydia, gracias por la respuesta. El conjunto de resultados que mostré se calculó en SQL y espero replicarlo en Power BI.

El problema es un poco más complicado que un mínimo / máximo tradicional, porque no necesito el mínimo / máximo de old / new_value (respectivamente). Necesito el valor antiguo asociado con el MIN (fecha_de_cambio), así como el nuevo valor asociado con el MAX (fecha_de_cambio). Para complicarlo aún más (y potencialmente para ver cómo / por qué las funciones de ventana funcionan tan bien con esto en SQL), no puede ser solo el mínimo / máximo de todo el conjunto de datos, debe ser el mínimo / máximo asociado con el mismo record_id y change_field. Además, me gustaría que el recuento de filas de elementos en el mismo record_id y change_field dentro del change_date correcto … aunque esto parece mucho más fácil.

parry2k

En respuesta a aburrido

intente seguir:

paso 1 – agregar una nueva columna

Change Number = Rankx(filter(History, History[record_id] = EARLIER(History[record_id]) && History[change_field] = EARLIER(History[change_field])), History[change_date],,ASC, dense)

paso 2: agregue una nueva medida para obtener el número de cambios:

Count of Changes = 
var totalChanges =  Calculate(max(History[Change Number]), AllExcept(history, History[record_id], History[change_field])) 
return totalChanges-1

paso 3: agregue una nueva medida para obtener el valor inicial

Initial Value = Calculate(FIRSTDATE(History[old_value]), Filter(AllExcept(history, History[record_id], History[change_field]), History[Change Number] = 1))

paso 4: agregue una nueva medida para obtener el valor más reciente

Latest Value = Calculate(FIRSTDATE(History[new_value]), Filter(AllExcept(history, History[record_id], History[change_field]), History[Change Number] = MAX(History[Change Number])))

agregue visual de tabla y suelte estos en valores:

ID de registro

Campo de cambio

Cuenta de cambios

Valor inicial

Valor más reciente

aburrido

En respuesta a parry2k

parry2k, agradezco la respuesta. Desafortunadamente, tu solución no funciona. Los valores iniciales / más recientes funcionan correctamente solo en el conjunto de datos como un todo, pero no recalculan cuando se aplica la segmentación al campo change_date. Ideas?

Deja un comentario

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