Общее количество DAX по последнему статусу

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