MEJOR PRÁCTICA: Búsqueda en la tabla de intervalos

Un usuario Pregunto ✅

henrikloev

Hola. He tratado de simplificar mi desafío.

Aporte:

HECHO

HECHO.jpg

Tabla de búsqueda

tabla_de_búsqueda.jpg

Ahora, lo que me gustaría hacer es

Agregar columna a FACT, donde

– El hecho[some number] se busca en Lookup_table.

Resultado Esperado

HECHO (después)

FACT_resultado esperado.jpg

Lo que he hecho, como puede ver en la barra de fórmulas, es crear una función utilizada en cada iterador. Luego, Table.Buffer(Lookup_table) y filtre Lookup_table y devuelva la tabla filtrada.

let Source = (tabla de consulta como tabla, buscar_desdeColumna como texto, buscar_enColumna como texto, algún valor como número) as table => let Selectrows = Table.SelectRows(tabla de consulta, cada Tabla.Columna(_, buscar_desdeColumna) <= algúnvalor y Tabla.Columna( _, lookup_toCol) >= algún valor ) en Selectrows en Source

Esto funciona bien. Sin embargo, cuando amplío esto, tengo la sensación de que no es tan eficiente como debería ser. El uso equivalente de VALUES() en DAX es mucho más eficiente, por lo que sé.

¿Qué estoy haciendo mal aquí? ¿Cómo se puede escribir esta función para obtener una mayor eficiencia?

jimmy801

Hola @henrikloev

lo que puede hacer es agregar una nueva columna donde use Table.SelectRows. Aquí un código para que te hagas una idea de lo que quiero decir.

Table.SelectRows(Table.Buffer(Lookup_table), (sel)=> sel[from number]<_[some number] and sel[to number]>_[some number])

Si esta publicación ayuda o resuelve su problema, márquelo como solución (para ayudar a otros usuarios a encontrar contenido útil y reconocer el trabajo de los usuarios que lo ayudaron)
Los saludos también son buenos

Divertirse

Palanqueta

henrikloev

En respuesta a jimmy801

Lo siento por la respuesta tardía.

¿En qué se diferencia esto de mi enfoque? No entiendo lo que se logra aquí. ¿Quizás podrías dar más detalles?

jimmy801

En respuesta a henrikloev

Hola @henrikloev

Estoy usando Table.Buffer y no uso Table.Column. Ni siquiera sé cómo Table.Column puede funcionar en estas circunstancias. ¿Probaste mi enfoque?

BR

Palanqueta

henrikloev

En respuesta a jimmy801

hola jimmy

He vuelto a esta publicación varias veces tratando de entender tu respuesta. Lo que me molesta es que no veo cómo puedo implementar su enfoque.

Tu respuesta: «lo que puedes hacer es agregue una nueva columna donde use una Table.SelectRows. Aquí un código para que te hagas una idea de lo que quiero decir»

Table.SelectRows(Table.Buffer(Lookup_table), (sel)=> sel[from number]<_[some number] and sel[to number]>_[some number])

1) No entiendo lo que quiere decir con «agregar una nueva columna». Te veo usando Table.SelectRows, sin agregar ninguna columna.

2) Mi uso de Table.SelectRows está anidado en una función, por lo tanto, no puedo llamar a _[some number]. Estoy pensando _[some number] no es significativo en este contexto? Es una constante, no un valor de campo de un registro.

3) No puedo llamar a sel[from number], nuevamente porque anido esto en una función: esta es la idea detrás de mí usando Table.Column(). Quiero poder hacer referencia a la columna en la función, ya que no conozco el nombre de la columna de antemano.

Ejemplo: lookup_fromCol como texto, lookup_toCol como texto, estas dos cadenas son entradas para mi función y representan los nombres de columna correspondientes dentro de Lookup_table.

Dispare si necesita más detalles.

¡Gracias!

Editar: esta es la #»función de búsqueda»: (también indicada, pero no nombrada en la pregunta inicial)

let Source = (lookuptable as table, lookup_fromCol as text, lookup_toCol as text, somevalue as number) as table => let Selectrows = Table.SelectRows(lookuptable, each Table.Column(_, lookup_fromCol) <= somevalue and Table.Column(_, lookup_toCol) >= somevalue ) in Selectrows in Source 

jimmy801

En respuesta a henrikloev

Hola @henrikloev

el código que publiqué estaba destinado a agregarse como fórmula una vez que agrega una nueva columna en la GUI.

Sin embargo, para acelerar esto, puedes intentar:

– ir al editor avanzado

– Agregue una nueva línea donde escriba BufferedLookUpTable= Table.Buffer(#»Lookup_table»),

– cambie el valor #»Lookup_table» a BufferedLookUpTable en su paso de columna adicional

Esto significa que está almacenando en búfer la búsqueda en una variable y dando esta tabla almacenada en búfer para invocar su función. Por lo tanto, no es necesario volver a leerlo en cada fila. Esto debería hacerlo.

Si esta publicación ayuda o resuelve su problema, márquelo como solución (para ayudar a otros usuarios a encontrar contenido útil y reconocer el trabajo de los usuarios que lo ayudaron)
Los saludos también son buenos

Divertirse

Palanqueta

henrikloev

En respuesta a jimmy801

hola jimmy

Desafortunadamente, ya lo he hecho, como dije en la pregunta inicial. La consulta #»Tabla de búsqueda» es

let Source = Excel.CurrentWorkbook(){[Name="Lookup_table"]}[Content],
in Table.Buffer(Source)

También intenté poner la parte Table.Buffer en la función misma, y ​​me parece que el efecto es idéntico, ¿ambos igualmente eficientes?

jimmy801

En respuesta a henrikloev

Hola @henrikloev

Creo que debe agregar el búfer de la tabla en la consulta, donde está fusionando ambas consultas, no en la original

BR

Palanqueta

Deja un comentario

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