Record.ToTable 求多列之间的差异
本期案例是对相同性质的列(字段名中字母一样的为同性质列)进行比较,如果行内对应的两列数据不一样,则在差异列中显示对应的列名名称,否则不显示。
前后转换效果如下:
解题套路
1.Record.ToTable
解题思路:将记录转换为表并排序,这样相同性质的行会显示在一起。
使用Table.Split进行拆分,将相同性质的行拆分为一个表。
对子表进行遍历转换,当满足Value列的值去重后的个数为1的时候,则代表无差异,赋值null;否则,将Name的值进行合并。
最后将结果进行合并操作。
Table.AddColumn(源,"diff",each Text.Combine(List.Transform(Table.Split(Table.Sort(Record.ToTable(_),"Name"),2),(x)=>if List.Count(List.Distinct(x[Value]))=1 then null else Text.Combine(x[Name],"-")),","))
这里的处理方式的好处是,相同性质的行数据通过排序、拆分可以简单的归集到一起,这样便于后续的一系列转换。
2.Record.ToList
解题思路:将行记录转换为列表,通过List.Zip与标题列表进行压缩组合,通过排序、列拆分,使相同性质的列表归集到一起。后续的转换同上述1中的转换相似。
对于去重后个数为1的赋值null,否则进行标题字段合并。
Table.AddColumn(源,"diff",each Text.Combine(List.Transform(List.Split(List.Sort(List.Zip({Table.ColumnNames(源),Record.ToList(_)}),each _{0}),2),(x)=>let lst=List.Distinct(x,each _{1}) in if List.Count(lst)=1 then null else Text.Combine(List.Transform(x,each _{0}),"-")),","))
以上是本期内容。