Check your eligibility for this 50% exam voucher offer and join us for free live learning sessions to get prepared for Exam DP-700.
Get StartedDon't miss out! 2025 Microsoft Fabric Community Conference, March 31 - April 2, Las Vegas, Nevada. Use code MSCUST for a $150 discount. Prices go up February 11th. Register now.
Hola
Quiero crear una matriz con Product, Oper_id, SerialNO y poder cortarla con un cortador que elimina n filas. Esa parte está hecha y funciona, más o menos.
A pesar de que me muestra el resultado correcto en el nivel de producto y Oper_Id, no muestra ningún dato en el nivel SerialNo. ¿Por qué? Sé que mi medida es bastante compleja. ¿Cómo puedo cambiar algo en la fórmula para poder ver los tiempos de duración a nivel de serie?
Se supone que mi matriz debe mostrar SUM a nivel de producto en la duración promedio en Oper_id y SerialNO. SerialNO se filtra mediante la segmentación de datos "remove n rows".
Me he dado cuenta de que si configuro la segmentación "eliminar n filas" en 0, aparece la duración. Pero tan pronto como cambio de cortadora, desaparecen. Creo que es causado por la ruptura del linaje de datos, probé muchas opciones diferentes y ninguna de las cuales funcionó.
Mi fórmula es un poco compleja y estoy bastante seguro de que podría escribirse de una manera 😉 más hermosa
AVG Duration without n rows =
VAR _TempTable =
ADDCOLUMNS(
SUMMARIZE(
'Table',
'Table'[PRODUCT],
'Table'[OPER_ID],
'Table'[SERIALNO],
'Table'[DURATION_S]
),
"RANKING", RANKX(
FILTER(
'Table',
EARLIER('Table'[PRODUCT]) = 'Table'[PRODUCT] &&
EARLIER('Table'[OPER_ID]) = 'Table'[OPER_ID]
),
'Table'[DURATION_S],
,
ASC,
DENSE
)
)
VAR _MinMaxRanking =
ADDCOLUMNS(
_TempTable,
"MinRanking",
MINX(
FILTER(
_TempTable,
[PRODUCT] = EARLIER([PRODUCT]) &&
[OPER_ID] = EARLIER([OPER_ID])
),
[RANKING]
),
"MaxRanking",
MAXX(
FILTER(
_TempTable,
[PRODUCT] = EARLIER([PRODUCT]) &&
[OPER_ID] = EARLIER([OPER_ID])
),
[RANKING]
)
)
VAR _N = [Remove N Rows Value]
VAR _Filtered =
FILTER(
_MinMaxRanking,
[RANKING] >= [MinRanking] + _N && [RANKING] <= [MaxRanking] - _N
)
VAR _AveragePerSerialNumber=
SUMMARIZE(
_Filtered,
[PRODUCT],
[OPER_ID],
[SERIALNO],
"@AVG", AVERAGEX(
FILTER(
_Filtered,
[PRODUCT] = EARLIER([PRODUCT]) &&
[OPER_ID] = EARLIER([OPER_ID]) &&
[SERIALNO] = EARLIER([SERIALNO])
),
[DURATION_S]
)
)
-- Sum on Product and Oper_id columns
VAR _Level1and2 =
SUMX(
SUMMARIZE(
_AveragePerSerialNumber,
[PRODUCT],
[OPER_ID],
"@AVGPerOperId", AVERAGEX(
FILTER(
_AveragePerSerialNumber,
[PRODUCT] = EARLIER([PRODUCT]) &&
[OPER_ID] = EARLIER([OPER_ID])
),
[@AVG]
)
),
[@AVGPerOperId]
)
-- Sum on serial number column
VAR _DurationSerialno =
SUMX(
_AveragePerSerialNumber,
[@AVG]
)
VAR _Duration =
IF(
HASONEVALUE( 'Table'[SERIALNO] ),
_DurationSerialno,
_Level1and2
)
VAR _Hours = INT( _Duration / 3600 )
VAR _Minutes = INT( MOD( _Duration - _Hours * 3600, 3600 ) / 60 )
VAR _Seconds = MOD( MOD( _Duration - _Hours * 3600, 3600 ), 60 )
VAR _Result =
IF(
_Duration <> 0,
FORMAT(_Hours, "00") & ":" & FORMAT(_Minutes, "00") & ":" & FORMAT(_Seconds, "00")
)
RETURN
_Result
Hola, @AntonioCarl
Pruebe por debajo de la medida
EVALUATE
VAR selectedvalue = [Remove N Rows Value]
VAR table_ = ALLSELECTED(
'Table'[PRODUCT],
'Table'[OPER_ID],
'Table'[SERIALNO],
'Table'[DURATION_S]
)
VAR rank_ = ADDCOLUMNS(
table_,
"Rank1", RANK(
DENSE,
table_,
ORDERBY(
'Table'[DURATION_S],
ASC
),
,
PARTITIONBY(
'Table'[PRODUCT],
'Table'[OPER_ID]
)
)
)
VAR minrank = MINX(
FILTER(
rank_,
'Table'[PRODUCT] = MIN('Table'[PRODUCT]) && 'Table'[OPER_ID] = MIN('Table'[OPER_ID])
),
[Rank1]
)
VAR maxrank = MAXX(
FILTER(
rank_,
'Table'[PRODUCT] = MIN('Table'[PRODUCT]) && 'Table'[OPER_ID] = MIN('Table'[OPER_ID])
),
[Rank1]
)
VAR filtertable = SUMMARIZE(
FILTER(
rank_,
[Rank1] >= minrank + selectedvalue && [Rank1] <= maxrank - selectedvalue
),
'Table'[PRODUCT],
'Table'[OPER_ID],
'Table'[SERIALNO],
'Table'[DURATION_S]
)
VAR firstaverage = ADDCOLUMNS(
filtertable,
"fisrtaverage", AVERAGEX(
FILTER(
filtertable,
'Table'[PRODUCT] = MIN('Table'[PRODUCT]) && 'Table'[OPER_ID] = MIN('Table'[OPER_ID]) && 'Table'[SERIALNO] = MIN('Table'[SERIALNO])
),
[DURATION_S]
)
)
VAR operandproductavgsum = SUMX(
SUMMARIZE(
firstaverage,
'Table'[PRODUCT],
'Table'[OPER_ID],
"secondaverage", AVERAGEX(
FILTER(
firstaverage,
'Table'[PRODUCT] = MIN('Table'[PRODUCT]) && 'Table'[OPER_ID] = MIN('Table'[OPER_ID])
),
[fisrtaverage]
)
),
[secondaverage]
)
VAR seriolnosum = SUMX(
firstaverage,
[fisrtaverage]
)
VAR result = IF(
ISINSCOPE('Table'[SERIALNO]),
seriolnosum,
operandproductavgsum
)
RETURN
result
@Dangar332Desafortunadamente, no es correcto.
Lo que quiero lograr se muestra en la imagen a continuación. Quiero obtener la duración de AVG sin el número de serie más pequeño y más grande dentro de Oper_id - mi fórmula funciona en ese caso.
Pero también quiero obtener la duración individual de cada serie, no se elimina por el cortador. Y esa es la parte con la que realmente lucho.
Hola, @AntonioCarl
Pruebe por debajo de la medida
Measure 5=
VAR Maintable = ALLSELECTED(
'Table'[PRODUCT],
'Table'[OPER_ID],
'Table'[SERIALNO],
'Table'[DURATION_S]
)
VAR RankTable = ADDCOLUMNS(
Maintable,
"Rank", RANK(
DENSE,
Maintable,
ORDERBY(
'Table'[DURATION_S],
ASC
),
,
PARTITIONBY(
'Table'[PRODUCT],
'Table'[OPER_ID]
)
)
)
VAR Minrank = MINX(
FILTER(
RankTable,
'Table'[PRODUCT] = MIN('Table'[PRODUCT]) && 'Table'[OPER_ID] = MIN('Table'[OPER_ID])
),
[Rank]
)
VAR maxrank = MAXX(
FILTER(
RankTable,
'Table'[PRODUCT] = MIN('Table'[PRODUCT]) && 'Table'[OPER_ID] = MIN('Table'[OPER_ID])
),
[Rank]
)
VAR _N = [Remove N Rows Value]
VAR filtertable = FILTER(
RankTable,
[Rank] >= Minrank + _N && [Rank] <= maxrank - _N
)
VAR Avgtable_serialno = AVERAGEX(
FILTER(
filtertable,
'Table'[PRODUCT] = MIN('Table'[PRODUCT]) && 'Table'[OPER_ID] = MIN('Table'[OPER_ID])
),
[DURATION_S]
)
VAR Avgtable_operlevel = AVERAGEX(
FILTER(
filtertable,
'Table'[PRODUCT] = MIN('Table'[PRODUCT]) && 'Table'[OPER_ID] = MIN('Table'[OPER_ID]) && 'Table'[SERIALNO] = MIN('Table'[SERIALNO])
),
[DURATION_S]
)
VAR _Duration = IF(
ISINSCOPE('Table'[SERIALNO]),
Avgtable_operlevel,
Avgtable_serialno
)
VAR _Hours = INT(_Duration / 3600)
VAR _Minutes = INT(MOD(
_Duration - _Hours * 3600,
3600
) / 60)
VAR _Seconds = MOD(
MOD(
_Duration - _Hours * 3600,
3600
),
60
)
VAR result =
IF(
_Duration <> 0,
FORMAT(
_Hours,
"00"
) & ":" & FORMAT(
_Minutes,
"00"
) & ":" & FORMAT(
_Seconds,
"00"
)
)
RETURN
result
Puede descargar el archivo desde abajo
Saludos
Dangar
Si esta publicación ayuda, considere Acéptalo como la solución para ayudar a los demás miembros a encontrarlo más rápidamente.
@Dangar332 Dios mío, gracias, ya casi está. He intentado agregar la suma en el nivel de producto de esos promediox en el nivel de operación, pero no puedo hacer que funcione.
¿Podrías ayudarme una vez más?
Gracias lo que quiero lograr:
Hola, @AntonioCarl
Pruebe por debajo de la medida
AVG Duration without n rows =
VAR _TempTable =
ADDCOLUMNS(
SUMMARIZE(
'Table',
'Table'[PRODUCT],
'Table'[OPER_ID],
'Table'[SERIALNO],
'Table'[DURATION_S]
),
"RANKING", RANKX(
FILTER(
'Table',
EARLIER('Table'[PRODUCT]) = 'Table'[PRODUCT] &&
EARLIER('Table'[OPER_ID]) = 'Table'[OPER_ID]
),
'Table'[DURATION_S],
,
ASC,
DENSE
)
)
VAR _MinMaxRanking =
ADDCOLUMNS(
_TempTable,
"MinRanking",
MINX(
FILTER(
_TempTable,
[PRODUCT] = EARLIER([PRODUCT]) &&
[OPER_ID] = EARLIER([OPER_ID])
),
[RANKING]
),
"MaxRanking",
MAXX(
FILTER(
_TempTable,
[PRODUCT] = EARLIER([PRODUCT]) &&
[OPER_ID] = EARLIER([OPER_ID])
),
[RANKING]
)
)
VAR _N = [Remove N Rows Value]
var Maintable =ALLSELECTED('Table'[PRODUCT],'Table'[OPER_ID],'Table'[SERIALNO],'Table'[DURATION_S])
var RankTable = ADDCOLUMNS(Maintable,"Rank",RANK(DENSE,Maintable,ORDERBY('Table'[DURATION_S],asc),,PARTITIONBY('Table'[PRODUCT],'Table'[OPER_ID])))
var Minrank =MINX(FILTER(RankTable,'Table'[PRODUCT]=MIN('Table'[PRODUCT]) && 'Table'[OPER_ID]=MIN('Table'[OPER_ID])),[Rank])
var maxrank = MAXX(FILTER(RankTable,'Table'[PRODUCT]=MIN('Table'[PRODUCT]) && 'Table'[OPER_ID]=MIN('Table'[OPER_ID])),[Rank])
var filtertable = FILTER(RankTable,[Rank]>=Minrank+_N && [Rank]<=maxrank-_N)
var Avgtable_serialno = AVERAGEX(FILTER(filtertable,'Table'[PRODUCT]=MIN('Table'[PRODUCT]) && 'Table'[OPER_ID]=min('Table'[OPER_ID])),[DURATION_S])
var Avgtable_operlevel = AVERAGEX(FILTER(filtertable,'Table'[PRODUCT]=MIN('Table'[PRODUCT]) && 'Table'[OPER_ID]=min('Table'[OPER_ID])&& 'Table'[SERIALNO]=MIN('Table'[SERIALNO])),[DURATION_S])
VAR _Filtered =
FILTER(
_MinMaxRanking,
[RANKING] >= [MinRanking] + _N && [RANKING] <= [MaxRanking] - _N
)
VAR _AveragePerSerialNumber=
SUMMARIZE(
_Filtered,
[PRODUCT],
[OPER_ID],
[SERIALNO],
"@AVG", AVERAGEX(
FILTER(
_Filtered,
[PRODUCT] = EARLIER([PRODUCT]) &&
[OPER_ID] = EARLIER([OPER_ID]) &&
[SERIALNO] = EARLIER([SERIALNO])
),
[DURATION_S]
)
)
-- Sum on Product and Oper_id columns
VAR _Level1and2 =
SUMX(
SUMMARIZE(
_AveragePerSerialNumber,
[PRODUCT],
[OPER_ID],
"@AVGPerOperId", AVERAGEX(
FILTER(
_AveragePerSerialNumber,
[PRODUCT] = EARLIER([PRODUCT]) &&
[OPER_ID] = EARLIER([OPER_ID])
),
[@AVG]
)
),
[@AVGPerOperId]
)
-- Sum on serial number column
VAR _Duration =
IF(
HASONEVALUE( 'Table'[SERIALNO] ),
Avgtable_operlevel,
_Level1and2
)
VAR _Hours = INT( _Duration / 3600 )
VAR _Minutes = INT( MOD( _Duration - _Hours * 3600, 3600 ) / 60 )
VAR _Seconds = MOD( MOD( _Duration - _Hours * 3600, 3600 ), 60 )
VAR _Result =
IF(
_Duration <> 0,
FORMAT(_Hours, "00") & ":" & FORMAT(_Minutes, "00") & ":" & FORMAT(_Seconds, "00")
)
RETURN
_Result
Descargar archivo desde abajo
Saludos
Dangar
Si esta publicación ayuda, considere Acéptalo como la solución para ayudar a los demás miembros a encontrarlo más rápidamente.
@Dangar332 ¡Gracias! Luché con él durante mucho tiempo y no pude hacer que funcionara. Ahora necesito analizar por qué mi medida no funcionó y qué has cambiado para que funcione.
Hola, @AntonioCarl
¿Puede proporcionar datos?, es difícil de predecir a partir del código.
Como no puedo agregar un archivo, tuve que subirlo a Dropbox. Aquí está el enlace: https://www.dropbox.com/scl/fi/ysdvdw1ejtmqekj0z653y/example.pbix?rlkey=xjnjmlvzvzoewb46ubglg1avz&st...