DAX encubierto a lenguaje M

Un usuario Pregunto ✅

vicentekatoh

Hola,

Necesita ayuda para convertir debajo de DAX a lenguaje M.

Después de lo cual, ¿cómo agrego el código de idioma M? ¿En a) «Agregar columna personalizada» ob) «Editor avanzado»?

MaxAttempts =
CALCULATE (
    MAX ( 'Table1'[attempts] ),
    FILTER (
        'Table1',
        'Table1'[Student] = EARLIER ( 'Table1'[Student] )
            && Table1[subject] = EARLIER ( 'Table1'[subject] )
    )
)

ImkeF

En respuesta a vicentekatoh

Claro: https://1drv.ms/u/s!Av_aAl3fXRbehasTVNp_izcVIvgFrA

Con un par de millones de filas, la carga podría ser más rápida con el enfoque «rápido» (usando Table.Group).

En cuanto a la memoria: actualmente puede omitir la columna «Intentos» y contar las filas en su lugar (List.Count en lugar de List.Max); en realidad, esto también podría acelerar la carga. Pero sus datos de muestra pueden dar una visión demasiado simplificada de su situación real.

ImkeF

En respuesta a vicentekatoh

¡No hay problema! Debe hacer referencia al paso anterior (que era «Fuente» en mi consulta y es #»Tipo cambiado» en la suya):

let
    Source = Excel.Workbook(File.Contents("C:UsersFinal Test Results.xlsx"), null, true),
    #"Raw data_no results_Sheet" = Source{[Item="Raw data_no results",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(#"Raw data_no results_Sheet", [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Student", Int64.Type}, {"Subject", type text}, {"Attempts", Int64.Type}, {"test result", type text}})
    #"Custom1" = Table.Join(#"Changed Type", {"Student", "Subject"}, Table.Group(#"Changed Type", {"Student", "Subject"}, {{"Max", each List.Max(_[Attempts])}}), {"Student", "Subject"}),
in
    #"Custom1"

greg_deckler

Mi sospecha es que va a ser bastante difícil convertir al lenguaje M debido al hecho de que M esencialmente se ocupa principalmente de las cosas en un nivel de fila. Para la primera parte de eso, podría agregar una columna personalizada con una expresión Table.Max quizás. En cualquier caso, tal vez @ImkeF tenga algunas ideas para ti.

ImkeF

En respuesta a greg_deckler

Puedes hacer ambas cosas 🙂

a) se parece más a la lógica DAX pero es lento:

= Table.AddColumn(Table1, "Slow", each 
List.Max(Table.SelectRows(Table1, (table1)=>
				table1[Student]=[Student] and 
				table1[Subject]=[Subject])
			  [Attempts])
)

Si hace esto a través de la interfaz de usuario, solo tiene que pegar el código de la fila 2-5 en el campo de diálogo.

b) es rápido y un poco más avanzado:

= Table.Join(Table1, {"Student", "Subject"}, 
Table.Group(Table1, {"Student", "Subject"}, {{"Max", each List.Max(_[Attempts])}}), {"Student", "Subject"}
)

Esta fila debe ingresarse en el editor avanzado o en la barra de fórmulas en el editor de consultas.

Vincentakatoh

En respuesta a ImkeF

Hola @ImkeF,

Intenté tanto A) como B) pero obtuve mensajes de error para ambos. ¿Puedes enviarme una muestra de pbix con ambos? Gracias.

Mi solución actual usa «Columna calculada» (DAX). Esperaba usar «Columna personalizada» (M), pensando que M consumirá menos recursos del sistema que DAX. Para este caso, ¿estoy en lo cierto? Los datos reales son unos pocos millones de filas. Como tal, el recurso del sistema es importante.

2017-07-06 09_02_34-Sin título - Editor de consultas.png

Estudiante Sujeto intentos resultado de la prueba
111 Prueba_A 1 Fail1
111 Prueba_A 2 Fail2
111 Test_A 3 Fail3
111 Prueba_A 4 Fail4
111 Test_B 1 Fail1
111 Prueba_B 2 Fail2
111 Prueba_B 3 Pase3
222 Prueba_A 1 Fail1
222 Prueba_A 2 Fail2
222 Prueba_A 3 Fail3
222 Prueba_B 1 Pase1
333 Prueba_C 1 Fail1
333 Prueba_C 2 Pase2

ImkeF

En respuesta a vicentekatoh

Claro: https://1drv.ms/u/s!Av_aAl3fXRbehasTVNp_izcVIvgFrA

Con un par de millones de filas, la carga podría ser más rápida con el enfoque «rápido» (usando Table.Group).

En cuanto a la memoria: actualmente puede omitir la columna «Intentos» y contar las filas en su lugar (List.Count en lugar de List.Max); en realidad, esto también podría acelerar la carga. Pero sus datos de muestra pueden dar una visión demasiado simplificada de su situación real.

vicentekatoh

En respuesta a ImkeF

Hola @ImkeF,

Soy realmente un muñeco M. ¡Por favor ayuda!

¿Puede aconsejarme cómo agregar el enfoque «Rápido» directamente en la tabla original, Editor avanzado? O puede proporcionar una muestra (sin crear una tabla separada «Rápido»). Agregado a continuación, pero recibió un mensaje de error.

let
    Source = Excel.Workbook(File.Contents("C:UsersFinal Test Results.xlsx"), null, true),
    #"Raw data_no results_Sheet" = Source{[Item="Raw data_no results",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(#"Raw data_no results_Sheet", [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Student", Int64.Type}, {"Subject", type text}, {"Attempts", Int64.Type}, {"test result", type text}})
	#"Custom1" = Table.Join(Source, {"Student", "Subject"}, Table.Group(Source, {"Student", "Subject"}, {{"Max", each List.Max(_[Attempts])}}), {"Student", "Subject"}),
in
    #"Custom1"

Se agregó el código pero hay un mensaje de error.

2017-07-06 16_28_49-Resultados finales de la prueba Estudiante 0706 - Editor de consultas.png

SI una nueva tabla «Rápida» es imprescindible, ¿puede aconsejarme cómo?

ImkeF

En respuesta a vicentekatoh

¡No hay problema! Debe hacer referencia al paso anterior (que era «Fuente» en mi consulta y es #»Tipo cambiado» en la suya):

let
    Source = Excel.Workbook(File.Contents("C:UsersFinal Test Results.xlsx"), null, true),
    #"Raw data_no results_Sheet" = Source{[Item="Raw data_no results",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(#"Raw data_no results_Sheet", [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Student", Int64.Type}, {"Subject", type text}, {"Attempts", Int64.Type}, {"test result", type text}})
    #"Custom1" = Table.Join(#"Changed Type", {"Student", "Subject"}, Table.Group(#"Changed Type", {"Student", "Subject"}, {{"Max", each List.Max(_[Attempts])}}), {"Student", "Subject"}),
in
    #"Custom1"

vicentekatoh

En respuesta a ImkeF

Hola @ImkeF,

Resuelto de nuevo. gracias por su paciencia. ¡PowerBI, soporte de energía!

vicentekatoh

En respuesta a vicentekatoh

Hola @ImkeF y @Greg_Deckler,

Solo quería comentar mi observación. La conclusión es usar «Columna calculada» (DAX).

Con gran ayuda de @ImkeF, convertí el DAX a M. No obstante, en los datos reales, el PBI se bloqueó cuando terminaron más datos.

Como tal, tal vez para mi propósito específico, Columna calculada es más eficiente en recursos.

Deja un comentario

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