【问题标题】:DAX/M count for consecutive months for every ID in PowerBIPowerBI 中每个 ID 连续几个月的 DAX/M 计数
【发布时间】:2021-03-19 08:26:20
【问题描述】:

我需要帮助找到一种计算连续月数的方法:

  • 对于每个“ID”(文本列)
  • 将“状态”列设为“缺失”或“暂停”

这是我的表格的样子(最后两列是我希望看到的输出):

ID Year Month Date (01-Month-Year) Status Consecutive Months "Missing" Consecutive Months "On Hold"
ID40 2019 6 01/06/2019 Missing 0 -
ID40 2019 7 01/07/2019 Missing 2 -
ID40 2019 8 01/08/2019 Missing 3 -
ID40 2019 11 01/11/2019 Missing 0 -
ID40 2019 12 01/12/2019 Missing 2 -
ID40 2020 9 01/09/2020 Missing 0 -
ID499 2019 1 01/01/2019 On Hold - 0
ID499 2019 2 01/02/2019 On Hold - 2
ID499 2019 3 01/03/2019 On Hold - 3
ID499 2020 9 01/09/2020 On Hold - 0
ID499 2020 10 01/10/2020 On Hold - 2
ID499 2020 8 01/08/2020 Missing 0 -
ID499 2020 9 01/09/2020 Missing 2 -
ID499 2020 10 01/10/2020 Missing 3 -
ID499 2020 11 01/11/2020 Missing 4 -
ID499 2020 12 01/12/2020 Missing 5 -

除了在“M”中合并嵌套查询之外,还有什么方法可以做到这一点?不幸的是,我已经尝试过了,但是 PowerBI 在处理数据时遇到了问题。

提前谢谢大家!

【问题讨论】:

  • 有没有可以用来排序数据的列?
  • 不,我不这么认为。目前数据首先按日期排序,然后按 ID(95690 个唯一 ID)排序。
  • 数据可以同时为 Missing 和 OnHold,例如 2020 年第 10 个月的 ID 499?
  • 你说得对,我的虚拟数据并不完全正确;正如您所指出的,对于相同的 ID,在给定的月份中,它要么是缺失的,要么是搁置的。

标签: powerbi dax powerquery powerbi-desktop m


【解决方案1】:

一种可能的解决方案是建立一个表,其中包含自表中第一年以来的年和月,并从中删除表中出现的年月。比计算当前年月和最后一个不存在的年月之间的月差。

这是一个可能的计算列,它使用 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] ),
                "YearMonthNumber",
                     ( 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, 0, Result )
)

Consecutive Months On Hold = 
IF (
    T[Status] = "On Hold",
    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] ),
                "YearMonthNumber",
                     ( 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, 0, Result )
)

这是放在可视化表格中的结果表格

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2023-04-06
  • 2022-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多