ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 980|回复: 9

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-10-10 08:55 | 显示全部楼层 |阅读模式
本帖最后由 flashevil 于 2020-10-10 08:57 编辑

2.png
List.Sum,List.Average,List.Max 三个函数均省略的参数,但我看不懂实际上这三个函数 运算的是哪个数据?如果是“更改的类型”但明显不对。如何理解函数在省略参数下运算的对象到底是谁?

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

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

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

TA的精华主题

TA的得分主题

发表于 2020-10-10 09:43 | 显示全部楼层
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])

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

发表于 2020-10-10 09:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
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

TA的精华主题

TA的得分主题

发表于 2020-10-10 10:21 | 显示全部楼层
用Table.ToList可以适当简化代码的书写:
untitled1.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-10-10 10:23 | 显示全部楼层
shaowu459 发表于 2020-10-10 09:52
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)}

TA的精华主题

TA的得分主题

发表于 2020-10-10 12:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
PowerQuery参考解法(来点简单写法
QQ截图20201010124403.png

PQ_Example.zip

21.09 KB, 下载次数: 8

TA的精华主题

TA的得分主题

发表于 2020-10-10 13:15 | 显示全部楼层
flashevil 发表于 2020-10-10 10:23
b=List.Transform({List.Sum,List.Average,List.Max},each _(a))
谢谢版主
上面这个字段就是用List.Tra ...

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

TA的精华主题

TA的得分主题

发表于 2020-12-15 20:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-12-20 08:46 | 显示全部楼层
flashevil 发表于 2020-10-10 10:23
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}))
复制代码

意义更明确一些。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-15 16:20 , Processed in 0.044137 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表