#powerbi #dax
Вопрос:
Мое хранилище данных выглядит следующим образом:
Case_ID;Date;Status_ID;Amount
1;01.09.2021;0;300
1;05.09.2021;2;320
1;06.09.2021;3;320
2;05.09.2021;3;100
3;02.09.2021;0;200
3;07.09.2021;1;200
...
Логика заключается в том, что для конкретного случая бизнеса Status_ID и сумма действительны с «Даты» до нового изменения или до конца календаря.
Для приведенных выше данных и окончания календаря по состоянию на 8.9.2021 моя требуемая мера должна дать следующий результат.
Date Case_ID Status_ID Amount
1.9.2021 1 0 300
2.9.2021 1 0 300
3.9.2021 1 0 300
4.9.2021 1 0 300
5.9.2021 1 2 320
6.9.2021 1 3 320
7.9.2021 1 3 320
8.9.2021 1 3 320
5.9.2021 2 3 100
6.9.2021 2 3 100
7.9.2021 2 3 100
8.9.2021 2 3 100
2.9.2021 3 0 200
3.9.2021 3 0 200
4.9.2021 3 0 200
5.9.2021 3 0 200
6.9.2021 3 0 200
7.9.2021 3 1 200
8.9.2021 3 1 200
Как я могу построить такую меру с помощью DAX?
Я нашел несколько блогов о «Полуаддитивных мерах» с несколькими подходами к получению последней суммы для идентификатора Case_ID, но я не знаю, как справиться с изменением статуса.
Комментарии:
1. У вас тоже есть таблица дат?
2. Моя реальная модель сложнее,но для этого примера я создал простую таблицу дат дата = КАЛЕНДАРЬ(дата(2021,9,1), дата(2021,9,8))
Ответ №1:
Если редактор запросов Power создаст новую таблицу, используя приведенный ниже код-
Примечание: Замените «your_table_name» на исходное имя таблицы из всего сценария.
let
Source = Table.SelectColumns(your_table_name, {"Case_ID", "Date"}),
#"Grouped Rows" = Table.Group(Source, {"Case_ID"}, {{"min_date", each List.Min([Date]), type nullable date}, {"max_date", each List.Max([Date]), type nullable date}}),
#"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each ([max_date]-[min_date])),
#"Extracted Days" = Table.TransformColumns(#"Added Custom",{{"Custom", Duration.Days, Int64.Type}}),
#"Added Custom1" = Table.AddColumn(#"Extracted Days", "Custom.1", each List.Range({0..[Custom]},0)),
#"Expanded Custom.1" = Table.ExpandListColumn(#"Added Custom1", "Custom.1"),
#"Added Custom2" = Table.AddColumn(#"Expanded Custom.1", "Custom.2", each Date.AddDays([min_date],[Custom.1])),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom2",{"min_date", "max_date", "Custom", "Custom.1"}),
#"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Custom.2", "Date"}}),
#"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns",{{"Date", type date}}),
#"Sorted Rows" = Table.Sort(#"Changed Type",{{"Case_ID", Order.Ascending}, {"Date", Order.Ascending}}),
#"Merged Queries" = Table.NestedJoin(#"Sorted Rows", {"Case_ID", "Date"}, your_table_name, {"Case_ID", "Date"}, "your_table_name", JoinKind.LeftOuter),
#"Expanded your_table_name" = Table.ExpandTableColumn(#"Merged Queries", "your_table_name", {"Status_ID", "Amount"}, {"your_table_name.Status_ID", "your_table_name.Amount"}),
#"Renamed Columns1" = Table.RenameColumns(#"Expanded your_table_name",{{"your_table_name.Status_ID", "Status_ID"}, {"your_table_name.Amount", "Amount"}}),
#"Filled Down" = Table.FillDown(#"Renamed Columns1",{"Status_ID", "Amount"})
in
#"Filled Down"
Вот результат-
Комментарии:
1. Спасибо вам за ваше решение на языке M в редакторе запросов. На примере набора данных он работает идеально, я протестирую его на больших данных. Реальные бизнес-кейсы обычно растягиваются более чем на год. Таким образом, преобразованная таблица по меньшей мере в 100 раз длиннее источника данных. Интересно, есть ли решение с мерой DAX без раздувания модели данных
2. Основная задача состоит в том, чтобы сгенерировать комбинацию date/case_id. Если вы справитесь с этим, остальное может сделать DAX.
3. Довольно легко сгенерировать комбинацию дата/идентификатор дела с помощью таблицы ВЫЧИСЛЕНИЙ ( ADDCOLUMNS ( СУММИРОВАТЬ («История», «История» [Идентификатор дела] ), «Дата», РАССЧИТАТЬ ( МАКС ( «История 1″[Дата] ) )), «Календарь»[Дата] Но это отражает только изменение суммы. Проблема в том, как добавить Status_ID.