Совпадение запроса на совпадение дат в нескольких строках - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь объединить 2 запроса в Power BI Desktop, сопоставляя строки на основе столбца пользователя и даты в одном запросе со строкой в ​​другом запросе, где совпадает пользователь, а дата во втором запросе является ближайшей до даты в 1-м запросе.

В других случаях мне нужно сопоставлять несколько столбцов, обычно я создаю составной ключ для сопоставления, но здесь это не прямое сопоставление.

Примеры 2 запросов:

QUERY1

User     Activity     Activity Date
User 1   Activity 1   2019-01-24
User 1   Activity 2   2019-03-03
User 1   Activity 3   2019-04-17

QUERY2

User     Status     Status Change Date
User 1   Status 1   2019-02-05
User 1   Status 2   2019-03-06
User 1   Status 3   2019-04-05

И объединенный запрос, который я ищу:

MERGED QUERY

User     Activity     Activity Date   Status
User 1   Activity 1   2019-01-24       
User 1   Activity 2   2019-03-03      Status 1
User 1   Activity 3   2019-04-17      Status 3

Оба запроса получены из REST API. Если бы это был источник SQL, я бы использовал SQL-запрос для создания производной островной таблицы дат начала и окончания на основе Query2 и выполнял BETWEEN-соединение с Query1, и это было бы источником для Power BI.

В редакторе Power Query, как мне получить результат объединенного запроса?

1 Ответ

0 голосов
/ 09 апреля 2019

Во-первых, вы хотите сделать, как вы предложили, и изменить таблицу состояния, чтобы вместо Status Change Date указывались даты начала и окончания.Вы можете сделать это, сортируя, индексируя и самостоятельно объединяя, как я ранее объяснил здесь и здесь .

Как только вы это сделаете, вы можете загрузитькопия таблицы состояния в каждой строке и использование столбцов User и Date для фильтрации таблицы и, наконец, возврата единственного значения для Status.

let
    Source = <Query1 Source>
    #"Added Custom" =
    Table.AddColumn(Source, "Status",
        (C) => List.First(
                   Table.SelectRows(Status, 
                       each [User] = C[User] and 
                            [Start] < C[Date] and
                            ([Stop] = null or C[Date] <= [Stop])
                   )[Status]
               ),
        type text)
in
    #"Added Custom"

Это говорит о том, что мы берем Status составьте таблицу и отфильтруйте ее так, чтобы в зависимости от текущей строки совпадения User и Date находились между Start и Stop.Из этой отфильтрованной таблицы мы выбираем столбец Status, который является типом данных списка, поэтому мы выбираем первый элемент списка, чтобы получить текстовое значение единственного члена списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...