题目:
从左表到右表,连续重复的只保留第一个。
解法:
如果是从右表到左表,那么可以直接向下填充就可以了,那么现在要求反过来。
在excel中,用工作表函数直接if还是很简单的,但是在PQ中没法对每个单元格设置公式,好像就比较麻烦。
之前介绍过List.Transform
配合索引的套路,我们按照工作表函数的思路来写写看:
let 源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content], 构建list = List.Transform(List.Positions(源[年级]),each try if 源[年级]{_}=源[年级]{_-1} then null else 源[年级]{_} otherwise 源[年级]{0}), 合并原表 = Table.FromColumns({构建list}&{源[班级]},Table.ColumnNames(源)) in 合并原表
因为没法直接在原表上转换,所以先单独构建list,使用List.Positions
直接获得列的索引,也就是{0..11},然后对其转换,分别获取[年级]列中每一行的值,再用if判断。
但是如果是第一行,索引是0,-1是负的就会报错,所以还要用try otherwise做个异常处理,如果错误就获取第一行。
构建完list,我们还要再合并到原表上,使用Table.FromColumns
即可。
还有一种方法是先添加索引列,然后使用Table.TransformColumns
对索引列转换,获取[年级]列的每一行。
和上面方法思路是一样的,我就不写了,请你尝试写出来。
Table.AddColumn(删除的副本, "自定义", each if [年级]=删除的副本{[索引=[索引]-1]}?[年级]? then null else [年级] )
求问,填充的同时后面增加标注1/2/3/4怎么操作
施老师,Table.TransformColumns对索引列进行转换这种方法,我试了很多次,但是都没有成功。
以下是我尝试写的,写得过程中我发现这个貌似需要(x)和(y)两个嵌套这种方式,但是我的只是单层。
最后一步是只尝试写了第一行,可否请您帮我删改一下呢?
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
INDEX列 = Table.AddIndexColumn(源,"INDEX"),
源嵌套 = Table.AddColumn(INDEX列,"嵌套",each INDEX列),
把第一行INDEX加一 = Table.TransformColumns(源嵌套[嵌套]{0}, {"INDEX",(x)=>x+1})
in
把第一行INDEX加一
因为表中行是唯一的,没有重复,因此不需要添加索引列,可以在原表上直接转换,代码如下:
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
逆填充=Table.FromRecords(Table.TransformRows(源,each if List.PositionOf(源[年级],[年级])=
Table.PositionOf(源,_) then _ else _&[年级=null]))
in
逆填充