[已解决] [PQ]菜鸟求助,一个应用案例中的3点不理解

  [复制链接]
查看116322 | 回复123 | 2021-2-18 19:31:05 | 显示全部楼层 |阅读模式
10848111524501.png
①List.Sum,List.Average,List.Max 三个函数均省略的参数,但我看不懂实际上这三个函数 运算的是哪个数据?如果是“更改的类型”但明显不对。如何理解函数在省略参数下运算的对象到底是谁?

②第二个each 为啥不会引起引用冲突?我之前的理解是嵌套内的引用 是用(x)=> x避免引用冲突。

③each _(a) 这部分不理解,首先是 _ 代表什么不理解,其实就是第一个问题,其次(a) 这是深化么?但list record的深化没有用括号的呀。。。

截图是完整案例的一部分,完整案例链接如下
https://mp.weixin.qq.com/s/2rlEepYA4OzVv6p-xZWm2w
回复

使用道具 举报

ruanx | 2021-2-18 19:36:05 | 显示全部楼层
1.List.Sum,List.Average,List.Max只是function,在{}中的时候并没有参与运算
2.不太清楚,最好用(x)=>x的方式
3.each _(a) 中的"_",指的是List.Sum,List.Average,List.Max中的一个,可以理解为List.Sum(a),并一个个往下循环引用
最好还是这样写:
List.Transform(Table.ToRows(data),each _ & [a=List.Skip(_),b=List.Transform({List.Sum,List.Average,List.Max},(x)=>x(a))][b])
回复

使用道具 举报

ftq | 2021-2-18 19:41:06 | 显示全部楼层
1、要看这3个函数,首先得看前面的List.Transform这个遍历函数,就是它通过这3个函数一一进行求和、平均、取最大。
2、2个each 有时不一定会冲突。
3、(a)就是前面那个记录的第1个字段内容。
就是遍历出,记录里a字段的求和、平均、最大值出来。
回复

使用道具 举报

wayne | 2021-2-18 19:48:06 | 显示全部楼层
1、[a=List.Skip(_),b=List.Transform({List.Sum,List.Average,List.Max},each _(a))],这个部分里a是得到了一个包含数据的List,然后List.Transform的第一个参数是{求和,平均,最大值}这样3个函数,在这里是谁都没有运算的,你就当一个List里的3个元素就成,只不过元素是函数,函数还没有删除任何参数。List.Transform的后面的each _(a)其中的_就分别代表第一参数中的3个函数,相当于list.Sum(a),List.Average(a),List.Max(a)运算一遍,得到包含这三个结果的List
回复

使用道具 举报

虫子 | 2021-2-18 19:55:06 | 显示全部楼层
用Table.ToList可以适当简化代码的书写:
10848111524502.png
回复

使用道具 举报

盈盈 | 2021-2-18 19:57:06 | 显示全部楼层
1、[a=List.Skip(_),b=List.Transform({List.Sum,List.Average,List.Max},each _(a))],这个部分里a是得到 ...


b=List.Transform({List.Sum,List.Average,List.Max},each _(a))
谢谢版主
上面这个字段就是用List.Transform 构造了 Record中的b,那是不是直接用定义法构造list更简单?
b={List.Sum(a),List.Average(a),List.Max(a)}
回复

使用道具 举报

蜜糖熊 | 2021-2-18 20:03:07 | 显示全部楼层
PowerQuery参考解法(来点简单写法)
10848111524503.png
10848111524504.zip (21.09 KB, 下载次数: 0)
回复

使用道具 举报

新力 | 2021-2-18 20:09:07 | 显示全部楼层
b=List.Transform({List.Sum,List.Average,List.Max},each _(a))
谢谢版主
上面这个字段就是用List.Tra ...


可以,没什么不可以的,是不同写法。M里很多组合都可以实现相同的功能。如果追求代码简洁之类的,也可以换写法。我5楼改写了一个,7楼也改了一个方法。
数据量小的时候,怎么写都行,能实现结果就成了,多学点套路方便用。
回复

使用道具 举报

GlitterMai | 2021-2-18 20:14:07 | 显示全部楼层
多种写法,都要熟悉一下吧!!
回复

使用道具 举报

时间 | 2021-2-18 20:19:07 | 显示全部楼层
b=List.Transform({List.Sum,List.Average,List.Max},each _(a))
谢谢版主
上面这个字段就是用List.Tra ...


其实把
  1. b=List.Transform({List.Sum,List.Average,List.Max},each _(a))
复制代码
写成
  1. b=List.Transform({List.Sum,List.Average,List.Max}, each Function.Invoke(_,{a}))
复制代码


意义更明确一些。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则