Запрос M Power — условное преобразование значений из динамического числа столбцов путем сравнения значений с двумя ссылочными столбцами

#date #dynamic #conditional-statements #powerquery

Вопрос:

Я застрял с трудностью, которую не в состоянии решить самостоятельно.

В наборе данных имеется несколько столбцов, создаваемых динамически. Их количество может варьироваться (от нескольких десятков до более чем ста). Они хранят данные в следующем формате даты: 01.10.2021 (день/месяц/год). В приведенных ниже примерах столбцы называются Дата1, Дата2, Дата3.

И есть две справочные колонки, также содержащие даты — Дату начала и Дату окончания (для подписки). Я хочу преобразовать значения даты условно из даты в формат 0-1, в зависимости от того, выполняется ли условие в ячейке по сравнению с контрольными датами.

Я хочу проверить для каждого столбца даты, находится ли дата в ячейке между датой начала и датой окончания подписки или после даты начала, если дата окончания отсутствует (другими словами, была ли подписка активной или нет в определенный день). Я хочу вернуть 1, если подписка была активной, или 0, если она не была активна в определенную дату.

Пример таблицы перед преобразованием:

Дата Начала Дата Окончания Дата 1 Дата 2 Дата 3
01.01.2020 01.05.2021 01.03.2020 01.04.2021 01.09.2021
01.05.2020 01.08.2021 01.03.2020 01.04.2021 01.09.2021
01.02.2021 нулевой 01.03.2020 01.04.2021 01.09.2021

Желаемый результат после преобразования:

Дата Начала Дата Окончания Дата 1 Дата 2 Дата 3
01.01.2020 01.05.2021 1 1 0
01.05.2020 01.08.2021 0 1 0
01.02.2021 нулевой 0 1 1

Я пробовал несколько решений, но в моем синтаксисе должна быть ошибка, потому что я получаю ошибку выражения: «Мы не можем применить доступ к полю к дате типа».

Последнее решение, которое я попробовал, было:

 Transformation = Table.TransformColumns(#"Previous step", List.Transform(FunctionToReturnListOfColumnNames(), each {_, each if [Start Date] lt;= _ and ([End Date] = null or [End Date] gt; _) then 1 else 0, type number}))  

Функция, возвращающая список имен столбцов, работает правильно, ошибка где-то в условном выражении.

Я попытался сначала преобразовать все столбцы даты в целые числа с помощью числа.Из функции() предположим, что могли возникнуть проблемы с логическими операторами, применяемыми к датам, но проблема сохраняется, даже если все столбцы преобразованы в числа, ошибка одна и та же, только для номера типа: «Мы не можем применить доступ к полю для номера типа».

Я был бы очень признателен, если бы вы указали на ошибку в моем синтаксисе.

Ответ №1:

Неживой … сравните … репиво

Все этапы:

Нажмите выбрать первые два столбца, щелкните правой кнопкой мыши, открепите другие столбцы

Добавьте пользовательский столбец с формулой

 if [Start Date] lt;= [Value] and ([End Date] = null or [End Date] gt; [Value]) then 1 else 0  

щелкните правой кнопкой мыши и удалите столбец Значение

нажмите кнопку выбрать столбец атрибутов

преобразовать… сводная колонка … столбец значений = пользовательский

при желании измените формат столбцов Даты начала и Даты окончания на даты

введите описание изображения здесь

 let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Source, {"Start Date", "End Date"}, "Attribute", "Value"), #"Added Custom" = Table.AddColumn(#"Unpivoted Other Columns", "Custom", each if [Start Date] lt;= [Value] and ([End Date] = null or [End Date] gt; [Value]) then 1 else 0), #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Value"}), #"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Attribute]), "Attribute", "Custom", List.Sum) in #"Pivoted Column"