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!
v-yuezhe-msft
@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]))
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?