Matrix 计算PowerBI矩阵中相邻列的差异
我每周有一些机器的“可用性”数字(百分比)。我的原始CSV数据如下所示: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 每周更新数据源,并
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)
- 稳定:条件不变的每周机器总数
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现在可以在两个不同的列中找到,分别为WW和35
步骤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,但考虑到性能,这会更好。