#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"