Power Query: si el número x está entre xey, entonces «Eliminar» o «Mantener»

Un usuario Pregunto ✅

Dan80

Hola a todos,

Tengo una lista de números de vuelo y deseo excluir algunos números de vuelo si están dentro de un rango específico. ¿Cómo haría esto en Power query?

Por ejemplo, tengo un gran conjunto de datos de vuelos individuales y quiero vincular el conjunto de datos a la tabla de referencia de vuelos para mantener / eliminar, por ejemplo, los números de vuelo:

1 a 500 mantener

501 a 600 eliminar

601 a 1000 mantener

por lo que el vuelo número 53 se mantendría pero el vuelo número 598 se eliminaría. Gracias,

dan80

tringuyenminh92

@ Dan80 Según tengo entendido, sus datos en la «tabla de referencia» se cambiarán / configurarán, por lo que necesitará una solución dinámica para buscar la acción para cada número de vuelo en los datos de vuelo.

Así que, por favor, compruebe mi solución basada en la función personalizada en Power Query

(archivo sample.pbix)

https: //lookaside.fbsbx.com/file/sample.pbix? token = AWwziSi9Ut52Zsq1mOTefjlCiFMLHC5QRB2RUXvz_69JZePIc …

(archivo de Excel para datos: hoja de vuelos y hoja de referencia)

https: //lookaside.fbsbx.com/file/Flights.xlsx? token = AWz-baAdF3L7Y5pW92Jeu8cQ6emRJEM9Oaz2WLR0sfKJCvHk …

2016-12-02_16h57_42.png2016-12-02_16h57_50.png

En primer lugar, creo una función personalizada en el Editor de consultas:

(Esta función buscará en su tabla de referencia y obtendrá la primera fila a la que pertenece el valor (número de vuelo actual). Y luego seleccione el campo de acción (Eliminar / Mantener)

2016-12-02_16h59_13.png2016-12-02_16h59_27.png

(value) =>
let
    Source = Reference,
    #"Filtered Rows" = Table.First(Table.SelectRows(Source, each ([From] <= value) and ([To] >= value))),
    #"Action" =  Record.Field(#"Filtered Rows","Action")
in
    #"Action"

Después de eso, en la pestaña «Lista de vuelo» y «Agregar columna», selecciono «Invocar función personalizada» para agregar una nueva columna con la función anterior:

2016-12-02_17h03_32.png2016-12-02_17h03_47.png

El resto es filtrar la columna GetActionForFlight con el valor Keep:

2016-12-02_17h07_11.png

Si esto funciona para usted, acéptelo como solución y también proporcione KUDOS.

fboratino

En respuesta a tringuyenminh92

@ tringuyenminh92 esta solución funciona perfectamente para mi requerimiento, el único problema es que para la tabla «Referencia» tengo como 5k filas y para «Lista de vuelo» tengo como 1.5m filas y cuando trato de agregar esto a mi informe, hago clic en el botón cerrar y aplicar, sigue «Aplicando cambios de consulta» y nunca termina, ¿hay alguna forma de optimizar la ejecución del código? Creo que el problema es intentar aplicar la función para una cantidad tan grande de filas.

MarcelBeug

En respuesta a fboratino

Mi sugerencia sería crear una tabla con eliminaciones individuales (o se queda, pero no necesitas ambos) de la tabla con rangos.

A continuación, une la tabla con números de vuelo con la tabla con eliminaciones, une type left anti, que solo mantendrá los números de vuelo que no están en la tabla con eliminaciones.

Consultas eliminadas:

let
    Source = KeepOrDelete,
    #"Filtered Rows" = Table.SelectRows(Source, each ([KeepOrDelete] = "delete")),
    #"Added Custom" = Table.AddColumn(#"Filtered Rows", "DeleteNumber", each {[From]..[To]}, type {Int64.Type}),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom",{"DeleteNumber"}),
    #"Expanded DeleteNumber" = Table.ExpandListColumn(#"Removed Other Columns", "DeleteNumber")
in
    #"Expanded DeleteNumber"

Consulta filtradaVuelos:

let
    Source = Table.NestedJoin(Flights,{"Flight Number"},Deletes,{"DeleteNumber"},"Deletes",JoinKind.LeftAnti),
    #"Removed Columns" = Table.RemoveColumns(Source,{"Deletes"})
in
    #"Removed Columns"

BhaveshPatel

Puede usar la columna Condicional para lograr esto.

Dan80

En respuesta a BhaveshPatel

Gracias, pero hay al menos 20 rangos de números que deben excluirse y además necesito que la fórmula sea dinámica, ya que los números excluidos pueden cambiar, por lo que una fórmula no es una opción. ¿Algo más que se te ocurra?

BhaveshPatel

En respuesta a Dan80

Creo que debería usar parámetros en la consulta para lograr lo que está buscando. Consulte AQUÍ para crear soluciones utilizando parámetros de consulta dinámicos.

Greg_Deckler

Bueno, puede hacer esto en Power Query o usando filtros de Informe / Página / Visualización. En Power Query, agregaría una línea como:

    #"Filtered Rows" = Table.SelectRows(#"Previous Step", each ([FlightID] < 501 and [FlightID] > 600))

Si hace esto después de la importación, simplemente arrastre «FlightID» al área de filtrado elegida y utilice el filtrado avanzado para seleccionar vuelos <501 Y superiores a 600.

Dan80

En respuesta a Greg_Deckler

Thansk espera por tu ayuda (¡una vez más!). Sin embargo, estaba usando un ejemplo simple, la tabla de exclusiones es mucho más larga que en la pregunta y, por lo tanto, no podré usar una fórmula. En Excel, uso un Index Match (no exacto) y eso funciona, pero necesito replicar la lógica en PQ.

Deja un comentario

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