向下填充逆过程

题目:


从左表到右表,连续重复的只保留第一个。

解法:

如果是从右表到左表,那么可以直接向下填充就可以了,那么现在要求反过来。
在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对索引列转换,获取[年级]列的每一行。
和上面方法思路是一样的,我就不写了,请你尝试写出来。

附件

4 Replies to “向下填充逆过程”

  1. Table.AddColumn(删除的副本, "自定义", each if [年级]=删除的副本{[索引=[索引]-1]}?[年级]? then null else [年级] )

  2. 施老师,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加一

  3. 因为表中行是唯一的,没有重复,因此不需要添加索引列,可以在原表上直接转换,代码如下:
    let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    逆填充=Table.FromRecords(Table.TransformRows(源,each if List.PositionOf(源[年级],[年级])=
    Table.PositionOf(源,_) then _ else _&[年级=null]))
    in
    逆填充

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注