Matrix 计算PowerBI矩阵中相邻列的差异

Matrix 计算PowerBI矩阵中相邻列的差异,matrix,powerbi,dax,powerbi-desktop,Matrix,Powerbi,Dax,Powerbi Desktop,我每周有一些机器的“可用性”数字(百分比)。我的原始CSV数据如下所示: Machine,WW,Availability A,WW35,0.9 B,WW35,0.95 C,WW35,1 D,WW35,0.87 A,WW36,1 B,WW36,1 C,WW36,0.84 D,WW36,0.94 A,WW37,0.75 B,WW37,0.98 C,WW37,0.91 D,WW37,0.89 A,WW38,1 B,WW38,0.88 C,WW38,0.99 D,WW38,0.95 每周更新数据源,并

我每周有一些机器的“可用性”数字(百分比)。我的原始CSV数据如下所示:

Machine,WW,Availability
A,WW35,0.9
B,WW35,0.95
C,WW35,1
D,WW35,0.87
A,WW36,1
B,WW36,1
C,WW36,0.84
D,WW36,0.94
A,WW37,0.75
B,WW37,0.98
C,WW37,0.91
D,WW37,0.89
A,WW38,1
B,WW38,0.88
C,WW38,0.99
D,WW38,0.95
每周更新数据源,并为每台机器添加新的工作周(WW)可用性数据。如果该周的可用性>90%,则机器被视为“合格”。我计算“通过”度量如下所示

Pass = 
VAR varCount = CALCULATE(COUNTA(data[Availability]), data[Availability] > 0.9)
RETURN
IF(varCount = BLANK(), 0, varCount)
矩阵中显示的每台机器每周的通过计数如下(给出上述数据):

现在,我想计算每台机器的这些通过值的一些数字。我的实际需求有点复杂,但我想要计算的最基本的东西很少显示在下面

  • 新通过:每周通过但上周失败的机器总数

    PrevPass = 
    VAR varCount = CALCULATE(COUNTA(data[PrevAvailability]), data[PrevAvailability] > 0.9)
    RETURN
    IF(varCount = BLANK(), 0, varCount)
    
  • 新失败:每周失败但通过前一周的机器总数

    PrevPass = 
    VAR varCount = CALCULATE(COUNTA(data[PrevAvailability]), data[PrevAvailability] > 0.9)
    RETURN
    IF(varCount = BLANK(), 0, varCount)
    
  • 稳定:条件不变的每周机器总数

为了更好地说明,我将所需结果放在Excel文件中:

在PowerBI社区论坛和这里,都有许多类似的问题,但在所有这些问题中,差异计算似乎都指定了一个恒定的列名,或日期(在我的例子中为WW)列的最大/最小值。但是我想要的是为每两个相邻的WW生成差异,并且随着我的源代码每周更新,我也想要显示新一周的差异

这可能吗

编辑 在我尝试了@mkRabbani下面的答案之后,我正在编辑这个问题以提供更多细节

正如我在评论中解释的那样,它不会让我像你一样创建度量。在
DAX
中,它不允许我在
IF
中使用列名。但是,我通过创建一些度量来解决这个问题,这些度量相当于
Availability
prevaailability

通过测量

Pass = 
VAR varCount = CALCULATE(COUNTA(data[Availability]), data[Availability] > 0.9)
RETURN
IF(varCount = BLANK(), 0, varCount)
PrevPass度量值

Pass = 
VAR varCount = CALCULATE(COUNTA(data[Availability]), data[Availability] > 0.9)
RETURN
IF(varCount = BLANK(), 0, varCount)
这是上周通过的机器数

PrevPass = 
VAR varCount = CALCULATE(COUNTA(data[PrevAvailability]), data[PrevAvailability] > 0.9)
RETURN
IF(varCount = BLANK(), 0, varCount)
通过将这些值放入矩阵中,我确认这些值与预期值相同

然后我创建了一个等价的度量,计算NewPass等

PassFailSteadyColumn = 
IF(
    'data'[PrevPass] = 0,
    BLANK(),
    IF(
        'data'[PrevPass] = 0 && 'data'[Pass] = 1,
        "New Pass",
        IF(
            'data'[PrevPass] = 1 && 'data'[Pass] = 0,
            "New Fail",
            "Steady"
        )
    )
)

到目前为止还不错,但现在当我尝试将
PassFailSteadyColumn
拖放到矩阵的
字段时,它根本不允许我这样做。给出了什么?

执行下面的电源查询步骤-

第1步:复制您的专栏WW

步骤2:使用固定的2个字符拆分新列。您的WW35现在可以在两个不同的列中找到,分别为WW35

步骤3:创建一个新的自定义列=(splitted Second Value-1)。这将基本上返回前一周的每行数

步骤4:现在使用下面的关系合并具有相同表的表-

column: **Machine** and **Previous Week**
column: **Machine** and **Week Number (Spllitted Second Value)**
第5步展开列,仅保留列“可用性”,并将其重命名为上一周可用性。您将获得最终输出,如下所示-

以下是来自高级编辑器的代码,供您参考-

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("XdDBCcAgDEDRXXKW0lJTk2O1O3gQ91+jkohGT8Ij+QRLgRcc5Hxje86DoboCcSEUS9Mugc8OURDrrWcMxR3ShLblbUmNvS0FsYA2psZke92Wy9SIbY/2y0iHlpgas43R+Iv6Aw==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Machine = _t, WW = _t, Availability = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Machine", type text}, {"WW", type text}, {"Availability", type number}}),
    #"Duplicated Column" = Table.DuplicateColumn(#"Changed Type", "WW", "WW - Copy"),
    #"Split Column by Position" = Table.SplitColumn(#"Duplicated Column", "WW - Copy", Splitter.SplitTextByPositions({0, 2}, false), {"WW - Copy.1", "WW - Copy.2"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Position",{{"WW - Copy.1", type text}, {"WW - Copy.2", Int64.Type}}),
    #"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"WW - Copy.2", "week number"}}),
    #"Added Custom" = Table.AddColumn(#"Renamed Columns", "prev week number", each [week number] - 1),
    #"Merged Queries" = Table.NestedJoin(#"Added Custom", {"Machine", "prev week number"}, #"Added Custom", {"Machine", "week number"}, "Added Custom", JoinKind.LeftOuter),
    #"Expanded Added Custom" = Table.ExpandTableColumn(#"Merged Queries", "Added Custom", {"Availability"}, {"Added Custom.Availability"}),
    #"Sorted Rows" = Table.Sort(#"Expanded Added Custom",{{"Machine", Order.Ascending}, {"week number", Order.Ascending}}),
    #"Renamed Columns1" = Table.RenameColumns(#"Sorted Rows",{{"Added Custom.Availability", "Availability Prev Week"}})
in
    #"Renamed Columns1"
现在返回报告,单击“关闭并应用”并创建以下两个度量值-

total_count = count('Table (3)'[Machine])
pass-fail稳定列=
如果(
'表(3)'[上一周的可用性]=空白(),
BLANK(),
如果(
“表(3)”[上一周的可用性].9,
“新通行证”,
如果(

“表(3)”[上一周的可用性]>.9&“表(3)”[可用性]我在PowerQuery中添加了前一周的可用性,成功地获得了新表,但现在在DAX中,它不允许我以您创建的方式创建“通过-失败-稳定列”。我得到消息:无法确定表“数据”中列“PrevAvailability”的单个值。当度量公式引用的列包含由于没有指定聚合,如MIN、MAX、COUNT或SUM,所以许多值都可以得到单个结果。It明智只允许我选择<代码>内的度量,如果,而不是列名。HI @ SACH,我的错误,请考虑第二个“PAD失败稳定列”。作为一个自定义列。不是度量值。那么,我们真的必须进入PowerQuery并创建额外的列才能做到这一点吗?我们不可能在DAX中做到这一点?很高兴看到它最终成功了:)。可能使用DAX,但考虑到性能,这会更好。