Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Earn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.

Reply
Syndicate_Admin
Administrator
Administrator

Encontrar diferencia entre 2 filas

DateTimeSerialIdGenHoursDiferencia
9/22/2020 18:04M3501-1184789espacio en blanco
4/12/2021 18:19M3501-1185047258
5/5/2021 14:28M3501-11850470
6/17/2021 15:10M3501-11850492
1/12/2021 17:01M8501-112928.4espacio en blanco
3/8/2021 20:31M8501-1121317388.6
4/12/2021 18:19M8501-11213170
5/5/2021 14:29M8501-11213170
8/31/2020 23:44M8501-1161201.7espacio en blanco
1/6/2021 20:56M8501-116130199.3
3/8/2021 20:31M8501-116131514
4/12/2021 18:19M8501-1162201095
4/24/2020 10:46M8501-1141859espacio en blanco
1/1/2021 17:00M8501-1141622237

Tengo la tabla anterior. Me gustaría encontrar la diferencia entre cada fila basada en el serialId, Querría el resultado de la columna "diferencia". ¿Puede alguien por favor proporcionar la solución?

Gracias

11 REPLIES 11
Syndicate_Admin
Administrator
Administrator

Allí, @axk180022

¿Puedo preguntarle si su problema ha sido resuelto? ¿Es útil para usted la publicación anterior?

Si lo hace, ¿podría marcar la publicación que ayuda como Respondida? Ayudará a los demás en la comunidad a encontrar la solución fácilmente si enfrentan el mismo problema con usted. Gracias.

Saludos
Equipo de apoyo a la comunidad _ Zeon Zheng

Si esta publicación ayuda,entonces considere Aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.

Syndicate_Admin
Administrator
Administrator

Hola

Esta fórmula de columna calculada funciona

Diff = if(isblank(CALCULATE(max(Data[DateTime]),FILTER(Data,Data[SerialId]=EARLIER(Data[SerialId])&&Data[DateTime]<EARLIER(Data[DateTime])))),blank(),abs(Data[GenHours]-lookupvalue(Data[GenHours],Data[DateTime],CALCULATE(max(Data[DateTime]),FILTER(Data,Data[SerialId]=EARLIER(Data[SerialId])&&Data[DateTime]<EARLIER(Data[DateTime]))),Data[SerialId],Data[SerialId])))

Espero que esto ayude.

Untitled.png

Syndicate_Admin
Administrator
Administrator

Hola

@AlexisOlson Sí. No pude reproducir sus resultados antes de abrir su archivo adjunto, porque simplemente consideré [Gen Hours] en su fórmula como una columna. Lo encontré después de abrir el archivo adjunto.
Creo que lo que @axk180022 podría necesitar es una columna. Tomé esto como un desafío y obtuve la fórmula anterior.

Hola, @axk180022, creo que las soluciones proporcionadas por @AlexisOlson @speedramps son viables, y espero que estas sean útiles para usted.

Saludos
Equipo de apoyo a la comunidad _ Zeon Zheng

Si esta publicación ayuda,entonces considere Aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente

Syndicate_Admin
Administrator
Administrator

Allí, @axk180022

Prueba esto:

Column = 
var _CurrDateTime=[DateTime]
var _PrevDateTime=MAXX(FILTER(ALL('Table'),[SerialId]=EARLIER([SerialId])&&[DateTime]<_CurrDateTime),[DateTime])
var _GenHours=CALCULATE(MAX('Table'[GenHours]),FILTER(ALL('Table'),[SerialId]=EARLIER([SerialId])&&[DateTime]=_PrevDateTime))

var _if=IF(ISBLANK(_GenHours),BLANK(),ABS([GenHours]-_GenHours))
return _if

Resultado:

vangzhengmsft_0-1635739680545.png

Consulte el archivo adjunto a continuación para obtener más detalles. Espero que esto ayude.

Saludos
Equipo de apoyo a la comunidad _ Zeon Zheng


Si esta publicación ayuda,entonces considere Aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.

@v-angzheng-msft Esta es solo una versión de mi solución como una columna calculada en lugar de una medida ...

Syndicate_Admin
Administrator
Administrator

Hola axk180022

Haga clic aquí para descargar una demostración

En Power Query:-

Reemplace "espacios en blanco" por null
haga clic en SerialId y ordenar
haga clic en DateTime y ordene

En el menú Consultas del extremo izquierdo:
haga clic con el botón derecho en la tabla y Referencias. Llame a la nueva tabla Tabla1.
haga clic con el botón derecho en la tabla y Referencias. Llame a la nueva tabla Tabla2.


En la Tabla 1 agregue un índice a partir de 0
En la Tabla2, agregue un índice a partir de 1

En la Tabla 1, combine la Tabla 2 en SerialId e Índice
Expanda la tabla2.GehHours


Agregar una nueva diferencia de columna = GehHours - Table2.GehHours

Haga clic aquí para descargar una demostración

Recuerde que somos voluntarios de la comunidad de BI, así que haga clic en el pulgar hacia arriba para que me tome la molestia de ayudarlo y luego acepte la solución si funciona. ¡Gracias!

Syndicate_Admin
Administrator
Administrator

Hay un montón de formas de abordar esto, pero un método que he utilizado varias veces es generar columnas de índice de desplazamiento y hacer una autocombinión que coincida con las dos columnas de índice para obtener la fila anterior. Es un poco extraño pero más eficiente computacionalmente que cualquier otro método que se me haya ocurrido.

Aquí hay una variación ligeramente diferente similar a las que vinculé:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("hdHREYMgEATQVhy+jdweBxz0kAoc+28jCkTNoOaPjzcsu8yzSZbZMjEN0ExiRvN2nvACdD0Pg0RNZhlnIxYFYoNIHfQksUBvfXOSWe9dsIgN+gy6gjUZR3LMhA1qhVxgYp2kSGe1QqbsegiHeNflGv50eXBqHeqK7LLICYYKmTDF1ibsb/Shl25t+Njl6+D/dKmQmZpjaR9NWc7BUi9Uv899rE29C8xmWT4=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [DateTime = _t, SerialId = _t, GenHours = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"DateTime", type datetime}, {"SerialId", type text}, {"GenHours", type number}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index0", 0, 1, Int64.Type),
    #"Added Index1" = Table.AddIndexColumn(#"Added Index", "Index1", 1, 1, Int64.Type),
    #"Merged Queries" = Table.NestedJoin(#"Added Index1", {"Index0"}, #"Added Index1", {"Index1"}, "Added Index1", JoinKind.LeftOuter),
    #"Expanded Added Index1" = Table.ExpandTableColumn(#"Merged Queries", "Added Index1", {"SerialId", "GenHours"}, {"SerialId.1", "GenHours.1"}),
    #"Added Custom" = Table.AddColumn(#"Expanded Added Index1", "Diff", each if [SerialId] = [SerialId.1] then [GenHours] - [GenHours.1] else null, type number),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Index0", "Index1", "SerialId.1", "GenHours.1"}),
    #"Sorted Rows" = Table.Sort(#"Removed Columns",{{"SerialId", Order.Ascending}, {"DateTime", Order.Ascending}})
in
    #"Sorted Rows"

Intente pegar esto en su ventana del Editor avanzado y repasó los pasos de uno en uno.

Editar:

Como sugiere @speedramps, podemos hacer la combinación en varias columnas para eliminar la comprobación [SerialId] = [SerialId.1].

Aquí está la consulta modificada:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("hdHREYMgEATQVhy+jdweBxz0kAoc+28jCkTNoOaPjzcsu8yzSZbZMjEN0ExiRvN2nvACdD0Pg0RNZhlnIxYFYoNIHfQksUBvfXOSWe9dsIgN+gy6gjUZR3LMhA1qhVxgYp2kSGe1QqbsegiHeNflGv50eXBqHeqK7LLICYYKmTDF1ibsb/Shl25t+Njl6+D/dKmQmZpjaR9NWc7BUi9Uv899rE29C8xmWT4=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [DateTime = _t, SerialId = _t, GenHours = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"DateTime", type datetime}, {"SerialId", type text}, {"GenHours", type number}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index0", 0, 1, Int64.Type),
    #"Added Index1" = Table.AddIndexColumn(#"Added Index", "Index1", 1, 1, Int64.Type),
    #"Merged Queries" = Table.NestedJoin(#"Added Index1", {"Index0", "SerialId"}, #"Added Index1", {"Index1", "SerialId"}, "Added Index1", JoinKind.LeftOuter),
    #"Expanded Added Index1" = Table.ExpandTableColumn(#"Merged Queries", "Added Index1", {"SerialId", "GenHours"}, {"SerialId.1", "GenHours.1"}),
    #"Added Custom" = Table.AddColumn(#"Expanded Added Index1", "Diff", each [GenHours] - [GenHours.1], type number),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Index0", "Index1", "SerialId.1", "GenHours.1"}),
    #"Sorted Rows" = Table.Sort(#"Removed Columns",{{"SerialId", Order.Ascending}, {"DateTime", Order.Ascending}})
in
    #"Sorted Rows"

Gen Hours es una medida que se crea que está a continuación

Horas Gen =
CALCULAR (
SUM ( Merge1[Todas las filas. GENERATORHOURS] ),
KEEPFILTERS (
TOPN (
4,
FILTRO (
ALLSELECTED ( Merge1 ),
Merge1[Serial ID] = MAX ( Merge1[Serial ID] ) &&
Merge1[Todas las filas. GENERATORHOURS] > 0
),
Merge1[CALLACTIONDATETIME], DESC
)
)
)
¿Podría ayudarme a crear una columna calculada algo como esto?
Diferencia = if(CALCULATE(MAX(Merge1[DateTime].[ Date]),FILTER(Merge1,Merge1[Serial ID]=EARLIER(Merge1[Serial ID])))= Merge1[DateTime]. [Fecha],ABS(Merge1[Todas las filas. GENERATORHOURS]-LOOKUPVALUE(Merge1[Todas las filas. GENERATORHOURS],Merge1[DateTime]. [Fecha],CALCULATE(max(Merge1[DateTime].[ Date]),FILTER(Merge1,Merge1[Serial ID]=EARLIER(Merge1[Serial ID])&&Merge1[DateTime].[ Fecha]<EARLIER(Merge1[DateTime].[ Fecha]))),Merge1[ID de serie],Merge1[ID de serie])),BLANK())

Ah, no me di cuenta de que estabas buscando una solución DAX. Eso es en realidad un poco más fácil.

Prueba esto:

Difference = 
VAR CurrDateTime = SELECTEDVALUE ( Merge1[DateTime] )
VAR PrevDateTime = CALCULATE ( MAX ( Merge1[DateTime] ), Merge1[DateTime] < CurrDateTime )
VAR PriorGenHours = CALCULATE ( [Gen Hours], Merge1[DateTime] = PrevDateTime )
RETURN
    IF ( NOT ISBLANK ( PriorGenHours ), ABS ( [Gen Hours] - PriorGenHours ) )

No estoy recibiendo ningún valor, está en blanco.

@AlexisOlson

No puedo decir qué está saliendo mal, ya que funciona bien para mí.

AlexisOlson_0-1635456521276.png

Compruebe el archivo adjunto.

Helpful resources

Announcements
PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.