Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more

v-stephen-msft

如何根据 Power Query 中另一列的条件获取列中的值

场景:

 

在 Power BI 中,我们可以通过 DAX 轻松获取具有特定条件的值。但是,对于 Power Query 中的 M 语言初学者来说,这将更加复杂。本博客将介绍如何根据 Power Query 中另一列的条件获取列中的值。

 

例:

 

vstephenmsft_0-1729760296809.png

预期结果:

vstephenmsft_1-1729760310447.png

vstephenmsft_2-1729760379722.png

整个过程包含以下的结果: 

  • 结果1:获取 Column1 中上一行的值。 
  • 结果2:对于 Column1 中的相同值,请在 Column2 中选择其最大值。 
  • 结果3:对于 Column1 中的相同值,请在 Column2 中选择其第一个值。 
  • 结果4:选取 Column1 中第一个值,其 Column2 中的相应值大于 5。 
  • 结果5:提取第 1 列中值为 B 的行。 

 

 

步骤: 

 

在表中添加索引列

vstephenmsft_3-1729760399856.png

vstephenmsft_4-1729760410949.png

 

添加自定义列或直接在需要此结果的其他 M 表达式中使用代码。 

vstephenmsft_8-1729760447842.png

结果1: 获取列 1 中上一行的值

 

vstephenmsft_9-1729760460909.png

代码解释:

(x)=>x[索引]:这是 M 语言的函数。函数表达式为: ( 参数-列表) 函数-返回-类型 =>函数-主体,参数-列表 和返回-类型是可选的。 在这里,它将返回一个仅包含与条件匹配的行的表,类似于 DAX 中的表达式 “FILTER(ALL('表格'), <筛选器>)”。

Table.SelectRows(表格, 条件)[列1]{0}:Table.SelectRows 函数将返回一个筛选后的表,然后添加一个列,该列将返回相应的筛选列表。在列后添加表达式 {数字} 将返回特定记录,符号 {} 中的数字表示列表中的行号值减 1。因此,在示例中,{0} 将返回列表中的第一行。由于只有一行根据条件 “[索引]=[索引]-1” 过滤,因此返回列中的前一个值。

 

结果2:对于 列1中的相同值,在 列2中选择其最大值

vstephenmsft_10-1729760604927.png

vstephenmsft_11-1729760611530.png

vstephenmsft_12-1729760617374.png

结果3:对于 列1中的相同值,在 列2中选择其第一个值

vstephenmsft_13-1729760629429.png

vstephenmsft_14-1729760634841.png

vstephenmsft_15-1729760640225.png

 

结果4:选取 列1中第一个值,其 列2中的相应值大于 5

vstephenmsft_16-1729760652089.png

vstephenmsft_17-1729760658066.png

vstephenmsft_18-1729760663573.png

结果5:提取第 1 列中值为 B 的行

在此方案中,打开一个新的空白查询并复制以下代码。

vstephenmsft_19-1729760674948.pngvstephenmsft_20-1729760687711.png

vstephenmsft_21-1729760693158.png

 

整个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