问题描述
我需要帮助找到计算连续月数的方法:
- 对于每个“ID”(文本列)
- 将“状态”列设为“缺失”或“暂停”
这是我的表格的样子(最后两列是我想看到的输出):
ID | 年 | 月 | 日期(01-Month-Year) | 状态 | 连续几个月“失踪” | 连续几个月“暂停” |
---|---|---|---|---|---|---|
ID40 | 2019 | 6 | 01/06/2019 | 失踪 | 0 | - |
ID40 | 2019 | 7 | 01/07/2019 | 失踪 | 2 | - |
ID40 | 2019 | 8 | 01/08/2019 | 失踪 | 3 | - |
ID40 | 2019 | 11 | 01/11/2019 | 失踪 | 0 | - |
ID40 | 2019 | 12 | 01/12/2019 | 失踪 | 2 | - |
ID40 | 2020 | 9 | 01/09/2020 | 失踪 | 0 | - |
ID499 | 2019 | 1 | 01/01/2019 | 暂停 | - | 0 |
ID499 | 2019 | 2 | 01/02/2019 | 暂停 | - | 2 |
ID499 | 2019 | 3 | 01/03/2019 | 暂停 | - | 3 |
ID499 | 2020 | 9 | 01/09/2020 | 暂停 | - | 0 |
ID499 | 2020 | 10 | 01/10/2020 | 暂停 | - | 2 |
ID499 | 2020 | 8 | 01/08/2020 | 失踪 | 0 | - |
ID499 | 2020 | 9 | 01/09/2020 | 失踪 | 2 | - |
ID499 | 2020 | 10 | 01/10/2020 | 失踪 | 3 | - |
ID499 | 2020 | 11 | 01/11/2020 | 失踪 | 4 | - |
ID499 | 2020 | 12 | 01/12/2020 | 失踪 | 5 | - |
除了在“M”中合并嵌套查询之外,还有什么方法可以做到这一点?不幸的是,我已经尝试过了,但是 PowerBI 在处理数据时遇到了问题。
提前谢谢大家!
解决方法
一个可能的解决方案是构建一个表,其中包含自表中第一年以来的年和月,并从中删除出现在表中的年月。然后计算当前年月和上一个不存在的年月之间的月差。
这是一个可能的计算列,它使用 EXCEPT 函数构建缺少年月的表。为了简化跨年月差的计算,它还准备了一个 YearMonthNumber 值,其中包含从第一年开始的渐进月数
由于在示例表中有单独的状态列,我添加了一个 IF 来相应地拆分列
我还添加了一个检查以返回 0 而不是 1,以匹配示例数据
Consecutive Months Missing =
IF (
T[Status] = "Missing",VAR FirstYear =
MIN ( T[Year] )
VAR CurrentYear = T[Year]
VAR CurrentMonth = T[Month]
VAR CurrentYearMonthNumber = ( CurrentYear - FirstYear ) * 12 + CurrentMonth
VAR YearMonths =
GENERATE (
SELECTCOLUMNS ( GENERATESERIES ( FirstYear,CurrentYear ),"Year",[Value] ),SELECTCOLUMNS (
GENERATESERIES ( 1,12,1 ),"Month",[Value],"YearMonthNumber",( [Year] - FirstYear ) * 12 + [Value]
)
)
VAR CurrentIDAndStatusYearMonths =
CALCULATETABLE (
ADDCOLUMNS (
SUMMARIZE ( T,T[Year],T[Month] ),( T[Year] - FirstYear ) * 12 + T[Month]
),ALLEXCEPT ( T,T[ID],T[Status] )
)
VAR MissingYearMonths =
EXCEPT ( YearMonths,CurrentIDAndStatusYearMonths )
VAR FirstMissingYearMonthNumber =
MAXX (
FILTER ( MissingYearMonths,[YearMonthNumber] < CurrentYearMonthNumber ),[YearMonthNumber]
)
VAR Result = CurrentYearMonthNumber - FirstMissingYearMonthNumber
RETURN
IF ( Result = 1,Result )
)
和
Consecutive Months On Hold =
IF (
T[Status] = "On Hold",Result )
)
这是放在表格中的结果表格