Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more
场景:
在 Power BI 中,我们可以通过 DAX 轻松获取具有特定条件的值。但是,对于 Power Query 中的 M 语言初学者来说,这将更加复杂。本博客将介绍如何根据 Power Query 中另一列的条件获取列中的值。
例:
预期结果:
整个过程包含以下的结果:
步骤:
在表中添加索引列
添加自定义列或直接在需要此结果的其他 M 表达式中使用代码。
结果1: 获取列 1 中上一行的值
代码解释:
(x)=>x[索引]:这是 M 语言的函数。函数表达式为: ( 参数-列表) 函数-返回-类型 =>函数-主体,参数-列表 和返回-类型是可选的。 在这里,它将返回一个仅包含与条件匹配的行的表,类似于 DAX 中的表达式 “FILTER(ALL('表格'), <筛选器>)”。
Table.SelectRows(表格, 条件)[列1]{0}:Table.SelectRows 函数将返回一个筛选后的表,然后添加一个列,该列将返回相应的筛选列表。在列后添加表达式 {数字} 将返回特定记录,符号 {} 中的数字表示列表中的行号值减 1。因此,在示例中,{0} 将返回列表中的第一行。由于只有一行根据条件 “[索引]=[索引]-1” 过滤,因此返回列中的前一个值。
结果2:对于 列1中的相同值,在 列2中选择其最大值
结果3:对于 列1中的相同值,在 列2中选择其第一个值
结果4:选取 列1中第一个值,其 列2中的相应值大于 5
结果5:提取第 1 列中值为 B 的行
在此方案中,打开一个新的空白查询并复制以下代码。
整个M代码:
结果1-4:
let
源 = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WclTSUTJUitWBsIzALCcgywTOMgaznIEsUzjLDMxyAbIs4CxzpdhYAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [列1 = _t, 列2 = _t]),
更改的类型 = Table.TransformColumnTypes(源,{{"列1", type text}, {"列2", Int64.Type}}),
已添加索引 = Table.AddIndexColumn(更改的类型, "索引", 0, 1, Int64.Type),
上一行的值 = Table.AddColumn(已添加索引, "上一行的值", each if [索引]=0 then "" else Table.SelectRows(已添加索引,(x)=>x[索引]=[索引]-1)[列1]{0}),
每组的最大值 = Table.AddColumn(上一行的值, "每组的最大值", each List.Max(Table.SelectRows(已添加索引,(x)=>x[列1]=[列1])[列2])),
每组的第一个值 = Table.AddColumn(每组的最大值, "每组的第一个值", each Table.SelectRows(已添加索引,(x)=>x[列1]=[列1])[列2]{0}),
特定条件 = Table.AddColumn(每组的第一个值, "特定条件", each Table.SelectRows(已添加索引,(x)=>x[列2]>5)[列1]{0})
in
特定条件
结果5:
let
源 = Table.SelectRows(查询1,each
[索引]>=Table.SelectRows(查询1,(x)=>x[列1]="B")[索引]{0}and
[索引]<=List.Max(Table.SelectRows(查询1,(x)=>x[列1]="B")[索引]))
in
源
希望这篇文章能帮助到有类似问题的人。
原作者:Yan Jiang
审核:Kerry Wang & Ula Huang
翻译:Stephen Tao
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.