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

时间:2020-09-29 01:25:42

标签: 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

每周更新数据源,并为每台机器添加新的工作周(WW)可用性数据。如果该周的可用性> 90%,则认为该计算机为“合格”。我计算出“通过”量度,如下所示。

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

每台机器每周的通过次数,以矩阵形式显示(如下所示):

enter image description here

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

  • 新密码:每星期通过但上周失败的计算机总数。

  • 新故障:每周发生故障但过去一周通过的计算机总数。

  • 稳定:每周条件不变的总计算机数。

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

enter image description here

在PowerBI社区论坛以及此处,都有许多类似的问题,但是在所有这些问题中,差异计算似乎指定了恒定的列名,或日期的最大值/最小值(在我的情况下为WW) 。但是我想要的是为每两个相邻的WW产生差异,并且由于我的来源每周更新一次,所以我也想显示新一周的差异。

这可能吗?

编辑

在尝试下面的@mkRabbani答案后,我正在编辑问题以提供更多详细信息。

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

通过测量

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

PrevPass措施

这是上周通过的计算机计数。

PrevPass = 
VAR varCount = CALCULATE(COUNTA(data[PrevAvailability]), data[PrevAvailability] > 0.9)
RETURN
IF(varCount = BLANK(), 0, varCount)

通过将它们放在矩阵中,我确认这些值与预期的一样。

enter image description here

然后,我创建了与您的计算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拖放到矩阵的Rows字段中时,它简直不让我这样做。有什么作用?

1 个答案:

答案 0 :(得分:2)

高级查询步骤-

下执行此操作

步骤1::复制列 WW

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

第3步:创建一个新的自定义列 =(第二个值-1)。这基本上将返回每行上周号。

第4步:现在使用以下关系合并该表与同一表-

column: **Machine** and **Previous Week**
column: **Machine** and **Week Number (Spllitted Second Value)**

第5步,展开该列,仅保留“可用性”列,并将其重命名为上一周的可用性。您将成为最终输出,如下所示:

enter image description here

这是高级编辑器中的代码供您参考-

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 steady column = 

if(
    'Table (3)'[Availability Prev Week] = BLANK(),
    BLANK(),
    if(
        'Table (3)'[Availability Prev Week] <= .9 && 'Table (3)'[Availability] > .9,
        "New Pass",
        if(
            'Table (3)'[Availability Prev Week] > .9 && 'Table (3)'[Availability] <= .9,
            "New Fail",
            "Steady"
        )
    )
)

现在将矩阵配置如下-

enter image description here

这是最终输出-

enter image description here

您可以使用过滤器从视觉上删除红色标记的线

在我的示例中,表名称被视为表(3)。进行相应的调整。

相关问题