Únase a 2 mesas en función de múltiples condiciones

Un usuario Pregunto ✅

Caroline_20

Hola comunidad

Soy bastante nuevo en Power Query y no puedo entender cómo traducir este sql en una consulta de energía. No puedo hacer una consulta SQL, ya que transformo la tabla una vez que está en Power BI y solo entonces la Tabla 1 está en la forma correcta.

Tengo dos tablas a las que quiero unirme en varias condiciones, orden, marca de tiempo y nombre.

Tabla 1

IDENTIFICACIÓN

Solicitar ID

comienzo

fin

nombre

1

1452

20.01.20 16:51:00

20.01.20 21:59:00

corriendo

2

1654

20.01.20

17:04:00

20.01.20

18:55:00

corriendo

3

1452

20.01.20

21:59:00

20.01.20

23:55:00

hecho

Tabla 2

identificación

Solicitar ID

marca de tiempo

número

nombre

8

1452

20.01.20 16:55:00

233

9

1452

20.01.20 17:13:00

203

10

1654

20.01.20

18:27:00

423

11

1452

20.01.20 21:04:00

203

12

1452

20.01.20 22:30:00

265

13

1452

21.01.20 01:22:00

255

Table3 – unido

identificación

Solicitar ID

marca de tiempo

número

Table2.ID

8

1452

20.01.20 17:01:00

233

1

9

1452

20.01.20 17:13:00

203

1

10

1654

20.01.20

18:27:00

423

2

11

1452

20.01.20 21:04:00

203

1

12

1452

20.01.20 22:30:00

265

3

13

1452

21.01.20 01:22:00

255

3

Dentro de las consultas SQL, probaría algo en este sentido.

RIGHT JOIN table2 ON table1.orderId = table2.orderId DONDE table2.timestamp BETWEEN table1.start AND table1.end OR WHERE (table2.timestamp BETWEEN table1.start AND (DATEADD (HOUR, 2, table1.end) AND name = ”hecho «

¿Alguien puede ayudarme a resolver este problema dentro de la consulta de energía?

Greg_Deckler

Entonces, ¿podría crear una columna en ambas tablas que concatenan los campos para unirse?

Greg_Deckler

Entonces, ¿podría crear una columna en ambas tablas que concatenan los campos para unirse?

Caroline_20

En respuesta a Greg_Deckler

Hola Greg,

usted tenía razón. Logré unir las tablas con columnas calculadas verificando mis condiciones y eliminando las filas que son inútiles.

por ejemplo, columna: marca de tiempo – inicio. Esa columna se filtra solo para valores positivos.

Caroline_20

En respuesta a Greg_Deckler

Entiendo que puedo usar esto en orderId + name, pero ¿cómo me ayuda esto con la parte de la marca de tiempo entre el inicio y el final?

Greg_Deckler

En respuesta a Caroline_20

Probablemente sea un problema para @ImkeF o @edhauns

ImkeF

En respuesta a Greg_Deckler

Hola @ Caroline_20

debe seleccionar las filas coincidentes de Table1 para cada fila de Table2, por lo que esta no será una consulta rápida. Para mejorar la velocidad al menos un poco, debe almacenar en búfer Table1 (ver archivo adjunto)

Agrega una columna con este código:

Table.SelectRows(
                    Table1, 
                    (x) => 
                        x[orderId] = [orderId] 
                        and (
                            (x[start] < [timestamp] and x[end] > [timestamp])
                            or ( ( [timestamp] > x[start] and [timestamp] < ( x[end] + #duration(0,2,0,0)))
                                   and x[name] = "done")
                            ))[ID]{0}

x significa Table1 y no necesita un prefijo para Table2 (la palabra clave «each» en el código M autogenerado crea el azúcar de sintaxis requerido para ello).

[ID] busca la columna de ID de la tabla filtrada y {0} selecciona el primer elemento de ella (M tiene un índice de base cero)

Deja un comentario

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