Contar los cambios en un valor / columna

Un usuario Pregunto ✅

Tengo un conjunto de datos y necesito contar la cantidad de veces que hubo cambios en un valor.

Mis datos están configurados de forma similar a esta …

TablaA

Fecha y hora Parte Cantidad
20/09/2021 12:00:00 am 8250 720
20/09/2021 1:00:00 am 9142 84
20/09/2021 2:00:00 am 8250 800
20/09/2021 3:00:00 am 8250 95
20/09/2021 4:00:00 am 7748 91
20/09/2021 5:00:00 am 9142 700

Para esta tabla, el valor devuelto sería 5.

También estoy vinculando esto a otra tabla que tiene más detalles sobre las partes. Esta tabla tiene una configuración similar a esta:

CuadroB

Parte TD C
8250 10000 7314
9142 10001 7314
7748 10000 9548
4152 10002 9548
2829 10002 4314
5416 66148 7314

Estoy vinculando la tabla A y B a través de una relación en «parte». Estoy extrayendo los valores TD y ST de Tableb y usándolos en la misma visualización.

Necesito valores únicos para cuántas veces se cambiaron las piezas, cuántas veces cambió TD y cuántas veces cambió ST.

Según los datos proporcionados, los valores deben ser 5 (cambios de pieza), 4 (cambios td) y 4 (cambios st).

He probado algunas fórmulas que he encontrado en línea, pero no puedo hacer que nada funcione correctamente, o que no solo devuelva el recuento / recuento distinto.

En respuesta a Syndicate_Admin

Esto resultó ser un problema de contexto que se resolvió mediante el uso de ALLSELECTED versus ALL:

Columna modificada = 
  VAR __DateTime = [DateTime]
  VAR __PreviousDateTime = MAXX(FILTER(ALLSELECTED('Table'),[DateTime]<__DateTime),[DateTime])
  VAR __PreviousPart = MAXX(FILTER(ALLSELECTED('Table'),[DateTime]=__PreviousDateTime),[Part])
RETURN
  IF([Part]=__PreviousPart,0,1)

@Locco Entonces, ¿sería esto correcto para los cambios de piezas, supongo que debe tener en cuenta tanto los cambios en las piezas como en la cantidad?

Parts Changes =
  COUNTROWS(
    DISTINCT(
      SELECTCOLUMNS('TableA',"Part",[Part],"Quantity",[Quantity])
    )
  ) - 1

No estoy entendiendo cómo obtener los cambios para los números TD y ST que presentó dados sus datos de muestra, ¿puede explicarlo?

En respuesta a Syndicate_Admin

Gracias @Greg_Deckler,

Eso no funcionó, solo devuelve un recuento distinto y no cuántas veces las partes realmente cambiaron. Si una parte se repite más tarde, esa parte no se cuenta.

Es posible que una pieza se repita varias veces en una columna, en este caso aún contaría como un «1», ya que la pieza no cambió realmente hasta que se cargó una nueva pieza. Si esa parte se repite más tarde en el día, entonces contaría para el total del cambio.

Para los recuentos de TD y ST, he fusionado las consultas, por lo que esto ya no puede ser un problema y si obtengo algo para contar correctamente los cambios de pieza, entonces eso también debería funcionar para los cambios de TD y ST.

Problema muy similar aquí, pero la solución allí no pude llegar a trabajar para mí:

https://community.powerbi.com/t5/Desktop/Count-number-of-changes-of-the-value/mp/487205

En respuesta a Syndicate_Admin

@Locco De acuerdo, ingeniero el enfoque MTBF. Vea mi artículo sobre el tiempo medio entre fallas (MTBF) que utiliza ANTES: http://community.powerbi.com/t5/Community-Blog/Mean-Time-Between-Failure-MTBF-and-Power-BI/ba- p / 3395 ….
El patrón básico es:
Columna =
VAR __Current = [Valor]
VAR __PreviousDate = MAXX (FILTER (‘Tabla’, ‘Tabla'[Date] DEVOLUCIÓN
__Anterior actual

En su caso:

Changed Column = 
  VAR __DateTime = [DateTime]
  VAR __PreviousDateTime = MAXX(FILTER('Table',[DateTime]<__DateTime),[DateTime])
  VAR __PreviousPart = MAXX(FILTER('Table',[DateTime]=__PreviousDateTime),[Part])
RETURN
  IF([Part]=__PreviousPart,0,1)

En respuesta a Syndicate_Admin

Gracias @Greg_Deckler,

Eso todavía no está devolviendo el resultado deseado.

He copiado una pequeña muestra de mis datos, utilizando la fórmula:

FECHA DE ACTUALIZACIÓN PARTE TD Columna cambiada Recuento de columnas modificadas Columna cambiada
16/08/2021 0:12 11164 TD27414 1 1 1
16/08/2021 0:51 14054 TD27955 1 1 1
16/08/2021 1:13 14470 TD28112 1 1 1
16/08/2021 1:46 14490 TD28312 1 1 1
16/08/2021 2:20 14093 TD28412 1 1 1
16/08/2021 2:45 14075 TD28412 1 1 1
16/08/2021 3:10 4344 TD21038 1 1 1
16/08/2021 3:55 2165 TD10454 1 1 1
16/08/2021 4:30 2008 TD10291 1 1 1
16/08/2021 5:09 2006 TD10449 1 1 1
16/08/2021 5:24 11438 TD34994 1 1 1
16/08/2021 5:43 11436 TD34994 1 1 1
16/08/2021 6:08 14168 TD34112 1 1 1
16/08/2021 6:29 11444 TD35234 1 1 1
16/08/2021 6:55 12255 TD27456 1 1 1
16/08/2021 7:12 12254 TD27456 1 1 1
16/08/2021 8:28 14324 TD34142 1 1 1
16/08/2021 8:52 11380 TD10294 1 1 1
16/08/2021 9:50 2920 TD10329 1 1 1
16/08/2021 10:29 2918 TD10296 1 1 1
16/08/2021 10:54 11299 TD10242 1 1 1
16/08/2021 11:42 14290 TD31375 1 1 1
16/08/2021 12:13 4294 TD16872 1 1 1
16/08/2021 13:07 4283 TD17754 1 1 1
16/08/2021 13:28 4293 TD16973 1 1 1
16/08/2021 13:57 14251 TD36196 1 1 1
16/08/2021 14:35 14054 TD27955 1 1 1
16/08/2021 14:48 14056 TD28013 1 1 1
16/08/2021 15:10 14327 TD35036 1 1 1
16/08/2021 16:10 14326 TD35036 1 1 1
16/08/2021 16:38 11649 TD34116 1 1 1
16/08/2021 16:58 11436 TD34994 1 1 1
16/08/2021 17:23 11438 TD34994 1 1 1
16/08/2021 17:45 14168 TD34112 1 1 1
16/08/2021 18:37 2987 TD13073 1 1 1
16/08/2021 18:53 2987 TD13073 1 1 1
16/08/2021 19:37 2165 TD10454 1 1 1
16/08/2021 21:57 4282 TD16692 1 1 1
16/08/2021 22:42 14182 TD16893 1 1 1
16/08/2021 23:24 4343 TD21038 1 1 1
16/08/2021 23:45 14289 TD21038 0 1 0

Hay una fila de suma que no aparece aquí, pero la primera instancia es con «Sin resumen», la segunda es con «Contar», la última es con «Suma», que devuelve el mismo valor que «Sin resumen».

No está devolviendo el # correcto como total, cuando debería dar un 0 está dando un 1. En algunos casos el TD # se repite y creo que un 0 debería rellenarse.

(He cambiado los parámetros de la fórmula a «TD» en el lugar de «Parte» para esta prueba ‘)

En respuesta a Syndicate_Admin

@Locco Funcionó para mí como una columna calculada, por lo que se llamó «Columna cambiada». Si lo quieres como medida necesitarás:

Changed Measure = 
  VAR __DateTime = MAX('Table23'[UPDATE_DATE])
  VAR __PreviousDateTime = MAXX(FILTER(ALL('Table23'),[UPDATE_DATE]<__DateTime),[UPDATE_DATE])
  VAR __PreviousPart = MAXX(FILTER(ALL('Table23'),[UPDATE_DATE]=__PreviousDateTime),[PART])
RETURN
  IF(MAX([PART])=__PreviousPart,0,1)

Como una columna según lo previsto porque se denombró «Columna cambiada»

Greg_Deckler_0-1632235174167.png

Además, el Total es un problema diferente: esto parece un problema de totales de medida. Muy común. Vea mi publicación al respecto aquí: https://community.powerbi.com/t5/DAX-Commands-and-Tips/Dealing-with-Measure-Totals/td-p/63376

Además, esta Medida Rápida, Medir Totales, La Palabra Final debería darle lo que necesita:
https://community.powerbi.com/t5/Quick-Measures-Gallery/Measure-Totals-The-Final-Word/mp/547907

En respuesta a Syndicate_Admin

Gracias de nuevo @Greg_Deckler,

Estoy usando una columna calculada y no medidas.

Todavía no creo que la fórmula esté devolviendo el resultado deseado. Editado la imagen que publicaste. En el área del círculo, ¿debería uno de estos valores repetitivos ser un 0? Esto se está contando como un cambio cuando no era un cambio real. Hay otras ocurrencias de esto donde el TD no cambió, pero parece estar contando como un cambio. Parece que solo funcionó en 1 elemento de línea donde devolvió un 0 (TD13073).

¿Estoy malinterpretando?

InkedGreg_Deckler_0-1632235174167_LI2.jpg

En respuesta a Syndicate_Admin

@Locco La columna solo se basa en una parte, ¿en qué quieres que se base? Primero dije si la parte cambia. ¿Lo que quieres es solo si el TD cambia? Si es así, reemplace las referencias de La pieza a TD.

En respuesta a Syndicate_Admin

Mis disculpas @Greg_Deckler, pensé que su captura de pantalla estaba configurada en TD y no en PART.

Sin embargo, el resultado deseado aún no se devuelve, ya sea que use TD o PART como referencia de columna.

En la captura de pantalla adjunta, he creado una columna que hace referencia a TD y una columna que hace referencia a PART. En realidad, hay 38 cambios de pieza, pero el valor devuelto es 41. En realidad hay 33 cambios de TD, pero el valor devuelto es 40.

Independientemente de la columna a la que se haga referencia, el valor devuelto no es correcto. Cuando no se produce un cambio, el valor de la tabla debe ser un 0, ¿correcto? Si eso es cierto, entonces hay muchos casos en los que está contando un cambio cuando no había ninguno.

Ejemplos:

PARTE – Marca de tiempo 5:23

TD – marca de tiempo 2:45, marca de tiempo de 5:43, marca de tiempo de 7:12, marca de tiempo de 10:53, marca de tiempo de 6:53

Todos esos se están contando como un cambio cuando en realidad no fue un cambio.

tdss.png

En respuesta a Syndicate_Admin

@Locco No obtengo esos resultados en absoluto. Consulte la Tabla 23 y la Página 5 de PBIX adjunta a continuación sig. También la línea 5:23 PM cambia los números de pieza de 11436 a 11438. Todo lo que puedo decir es que o tenemos datos diferentes o no está traduciendo el DAX correctamente.

En respuesta a Syndicate_Admin

Gracias @ Greg_Deckler, agradezco su ayuda y paciencia.

En tu libro, estás usando medidas. He estado usando columnas calculadas y nunca he usado medidas. Tienes una columna, «Changed Column GJD», que también devuelve el mismo valor incorrecto que está en mi libro.

¿Debo usar medidas o columnas calculadas?

En respuesta a Syndicate_Admin

@Locco No hay nada incorrecto en Columna modificada GJD. Se basa en la Pieza, no en TD e identifica correctamente cuándo la Pieza ha cambiado. Puede utilizar una columna o una medida. Por lo general, se recomienda una medida si desea que el cálculo sea dinámico, como en función de la entrada / interacción del usuario. Las medidas también son preferibles en el sentido de que no agregan al espacio consumido por el modelo de datos en la misma medida que las columnas. Agregué una columna para el cálculo de TD. Consulte el archivo PBIX actualizado adjunto.

En respuesta a Syndicate_Admin

Gracias @Greg_Deckler,

He estado revisando esto durante horas y no puedo entender lo que está pasando. La única diferencia entre mis datos y los tuyos es que los míos son una consulta combinada y tengo muchos más datos.

En tu libro las fórmulas funcionan bien, pero en el mío no producen los mismos resultados. Las columnas producen los valores incorrectos que ya hemos discutido, y cuando uso la medida nada se rellena. En una tarjeta se queda en blanco, y puedes ver el pequeño círculo «pensando» icono giratorio en la esquina.

¿Importa el hecho de que esté fusionando consultas?

Volviendo a mi declaración original con respecto a múltiples tablas …

Si esta fórmula funciona para una parte:

Columna modificada = 
  VAR __DateTime = [DateTime]
  VAR __PreviousDateTime = MAXX(FILTER('Table',[DateTime]<__DateTime),[DateTime])
  VAR __PreviousPart = MAXX(FILTER('Table',[DateTime]=__PreviousDateTime),[Part])
RETURN
  IF([Part]=__PreviousPart,0,1)

¿Cómo conseguiría que funcionara si PART estaba en otra tabla? Este es el problema que tengo con TD y ST, esos están en otra tabla. Fusioné consultas para reunir todos los datos, pero no sé si eso está causando mis problemas con las columnas calculadas incorrectas.

En respuesta a Syndicate_Admin

Finalmente actualizó la tarjeta con «Changed Measure Total TD» y en el lugar de los 34 que dice en su libro, dice 52k. Parece que la medida no ve los filtros que se han aplicado y está aplicando la medición a toda la columna con respecto a cualquier valor filtrado / cortado.

Editar: Se pudo arreglar esto cambiando ALL en la fórmula de medida a VALORES, pero la medida aún devuelve el mismo valor que la fórmula de columna (que no es el valor correcto).

En respuesta a Syndicate_Admin

Esto resultó ser un problema de contexto que se resolvió mediante el uso de ALLSELECTED versus ALL:

Columna modificada = 
  VAR __DateTime = [DateTime]
  VAR __PreviousDateTime = MAXX(FILTER(ALLSELECTED('Table'),[DateTime]<__DateTime),[DateTime])
  VAR __PreviousPart = MAXX(FILTER(ALLSELECTED('Table'),[DateTime]=__PreviousDateTime),[Part])
RETURN
  IF([Part]=__PreviousPart,0,1)

En respuesta a Syndicate_Admin

@Locco Cualquier posibilidad de que comparta su PBIX ya sea a través de un enlace compartido o de forma privada por correo electrónico. Esa va a ser la resolución más rápida para esto. De lo contrario, necesito mucha más información sobre lo que está sucediendo en su modelo, como cómo se definen las relaciones, etc. No puedo imaginar por qué fusionar las consultas causaría un problema. Cuando está editando su fórmula para TD, ¿está capturando los dos lugares en los que reemplaza la pieza?

Columna modificada = 
  VAR __DateTime = [DateTime]
  VAR __PreviousDateTime = MAXX(FILTER('Table',[DateTime]<__DateTime),[DateTime])
  VAR __PreviousPart = MAXX(FILTER('Table',[DateTime]=__PreviousDateTime),[Part]) //change [Part] to [TD} here
RETURN
  IF([Part]=__PreviousPart,0,1) // también necesita cambiar [Part] a [TD] aquí

Deja un comentario

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