在PowerBI中创建名为RequiredOutput的计算列求助
在PowerBI中创建RequiredOutput计算列的解决方案
需要基于包含ID、Date、OldStatus、NewStatus字段的数据集,创建名为RequiredOutput的计算列,实现状态的连续继承逻辑:初始状态为ID的第一个变更记录的旧状态,后续状态随变更记录更新为新状态,无变更的行继承最近一次的状态。
样本数据
| ID | Date | OldStatus | NewStatus | RequiredOutput |
|---|---|---|---|---|
| 12345 | 30/09/2021 | Self | ||
| 12345 | 31/10/2021 | Self | ||
| 12345 | 30/11/2021 | Self | Team | Team |
| 12345 | 31/12/2021 | Team | ||
| 12345 | 31/01/2022 | Team | Self | Self |
| 12345 | 28/02/2022 | Self | ||
| 56789 | 30/09/2021 | Team | ||
| 56789 | 31/10/2021 | Team | ||
| 56789 | 30/11/2021 | Team | Self | Self |
| 56789 | 31/12/2021 | Self | ||
| 56789 | 31/01/2022 | Self | Team | Team |
| 56789 | 28/02/2022 | Team |
DAX计算列代码
请将代码中的TableName替换为你的实际表名:
RequiredOutput = VAR CurrentID = 'TableName'[ID] VAR CurrentDate = 'TableName'[Date] -- 筛选当前ID下所有状态变更行(OldStatus和NewStatus均非空) VAR ChangeRows = FILTER( ALL('TableName'), 'TableName'[ID] = CurrentID && NOT(ISBLANK('TableName'[OldStatus])) && NOT(ISBLANK('TableName'[NewStatus])) ) -- 获取当前日期及之前的最后一次变更记录的日期 VAR LastChangeDate = CALCULATE( MAX('TableName'[Date]), FILTER(ChangeRows, 'TableName'[Date] <= CurrentDate) ) -- 获取最后一次变更对应的新状态 VAR LatestStatus = CALCULATE( VALUES('TableName'[NewStatus]), FILTER(ChangeRows, 'TableName'[Date] = LastChangeDate) ) -- 获取当前ID的初始状态(最早变更记录的旧状态) VAR InitialStatus = CALCULATE( VALUES('TableName'[OldStatus]), FILTER(ChangeRows, 'TableName'[Date] = MIN(ChangeRows[Date])) ) -- 优先返回最近一次变更的状态,无变更则返回初始状态 RETURN IF(NOT(ISBLANK(LastChangeDate)), LatestStatus, InitialStatus)
逻辑说明
- 先捕获当前行的ID和日期,筛选出当前ID下所有有效的状态变更行(即
OldStatus和NewStatus都不为空的行)。 - 找到当前日期及之前的最后一次变更记录,获取对应的
NewStatus作为最新状态。 - 如果当前行在所有变更记录之前,取该ID最早变更记录的
OldStatus作为初始状态。 - 根据是否存在最近变更,返回对应的状态值。
内容的提问来源于stack exchange,提问作者Code_ninja
相关产品推荐
相关产品推荐

