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

Don'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.

Reply
Syndicate_Admin
Administrator
Administrator

El promedio no aparecerá en algún nivel de la matriz

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

Snipaste_2024-09-03_10-13-15.png

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
11 REPLIES 11
Syndicate_Admin
Administrator
Administrator

¿Alguien, por favor? @Dangar332 ?


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.
What I want to get.png

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:
Almost there!.png

@Dangar332 o alguien podría ayudar?

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

Dangar332_0-1726602363736.png


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

Disfruta de tu día 🙂

Syndicate_Admin
Administrator
Administrator

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...

Helpful resources

Announcements
Las Vegas 2025

Join us at the Microsoft Fabric Community Conference

March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount!

December 2024

A Year in Review - December 2024

Find out what content was popular in the Fabric community during 2024.

Top Solution Authors
Top Kudoed Authors