Power Query中M函数基础及上下文详解
suiw9 2024-12-01 03:59 23 浏览 0 评论
这是我们PQ第三期,讲完本期,基础基本就毕业了,后面可能会对一下难点函数讲解!
M函数中由于没有单元格概念,我们第二期所讲,基本是“列操作”,整理公式完全一样,那么为什么出来的结果又不一样呢?因为同样的公式在不同的环境下,效果不同,这里的不同环境也就是我们要讲的上下文!
以上关于上下文新手肯定是不太好理解,具体我们还是结合案例来看一下!
案例:给销售添加一列金额
我们先不直接添加金额,来看一下这里的上下文问题!
以上M函数公式有两个新东西,一个是each 、一个是下划线!
先说一下他们组合在一起的时候,到底是什么?
我们在新窗口下输入 -each _,不管是通过图标还是下面的含义都可以看出他是一个函数(function)
我们再看一下Tabe.AddColumn这个函数的帮助说明:
要求是一个function 有就是需要一个函数,在M函数中参数为函数是非常常见的,大家以后会经常遇到!
既然说到M函数,我们就来说一下M函数中的自定义函数如何表示?
我们使用
(参数1 as 类型,参数2 as 类型……)=>计算表达式
来自定义函数当然可以看到我们举例中的iSum函数x并没有指定类型any类型(任意)
其他相关类型如下:
自定义函数我们先简单了解,等我们说完上下文,回头再谈具体应用!
现在我们就可以继续聊上下文的事情了!
在案例中,输入完公式后我们会发现金额都是一个Record,点开第一个会发现 是当前行形成的一个记录!这里的上下文就是当前行,公式是基于每一个(each)行来写的,我们可以使用当前行中任意列,或者不用,比如 each 1,表示都添加1!
当然我们现在不能说,所有的上下文都是当前行,比如我们遍历一个list,那么对应的上下文可能就是每一个元素!
= List.Transform({1..10},each _+1)
这里的上下文其实是列表中的每一个元素!
所以上下文和我们平时聊天的语境是一个意思!比如张三突然说:“我去啊”
在不知道聊天的前后对话,我们完全无法肯定是什么意思?
但是当我们知道前面有人骂了一句张三,那么这个“我去"可能就表示愤怒的意思。要是前面是一个美女问张三"你明天不去看电影吗?",那么意思则完全不同!
听完是不是感觉懂了,但是感觉写M函数公式的时候又不知道怎么用?
其实大家不用担心,我们现在就来说一招! 在M函数书写过程中,当我们找发现一个参数是function类型,那么肯定可以写成each _,这个时候,我们就可以来观察当前的上下文,也就是下划线在当前上下文目前到底表示什么的!
比如案例中,当我们点击第二行时发现是第二行的所形成的记录!其他行都是如此!
那么我们的金额就好些了,就是使用当前上下文下的数量*单价,下划线表示当前行,是一个记录,那么从记录中获取一项,我们是需要 记录集[key]即可
= Table.AddColumn( 源,"金额",each _[单价]*_[ 数量])
由于我们知道当前的上下文就是当前行,没有其他干扰(以后我们会学到上下文嵌套的问题),所以可以不写下划线
前面我们学过 each _是函数fx(x)=>计算表达式也是函数,那么这里应该可以使用fx来处理!
= Table.AddColumn(源,"金额",(x)=>x[单价]*x[ 数量])
有其他语言基础的同学,可能看出这个有点匿名函数的感觉 和js中的箭头函数类型,当然我们也可以先定义一个具名函数再调用,都是一样的!
在有上下文嵌套的情况下,一般我们需要考虑使用自定义函数,因为一个下划线无法区分开!常见的案例就是累加问题!1-10依次累加!
以上就存在上下文嵌套问题!我们的思路,把1-10中每一个都拿出来和1-10比一下,挑出小于等于当前值的。那么这里就存在原本的1-10 和本次遍历的当前值,如果我们都用下划线
= List.Transform(源,each List.Sum(List.Select(_,each _ <=_))) -- 错误
你会发现完全没法读,逻辑错误!但是我们使用自定义函数,就可以区别开
x表示遍历的每一个值,each _表示我们List.Select中源中的1-10!
比如我们第二个合计是1+2=3 怎么计算的呢?首先x是2,到内部(each _)我们用1-10依次和2比较,小于等于2的保留下来,最后通过List.Sum求和
以上我们也可以都修改为自定义函数
= List.Transform(源,(x)=>List.Sum(List.Select(源,(y)=>y<= x)))
注意:(y)=>y<= x 中=> 是自定义函数表示方式,不是大于等于的意思,第二个 <= 是真的小于等于的含义!
each _ 其实是一种语法糖,自定义函数的一种简化写法!
最后我们补充一下let …… in …… 结构,M基础篇就算完结了!
当我们要处理的逻辑比较复杂的时候,一般我们会通过高级编辑器来写,在其中我们使用
let 处理过程 in 结果
处理过程可以是多步,每步直接使用逗号隔开,后面的写的可以调用前面已经写好的任意过程(不用完全连续)!结果 一般使用最后一步,但是我们可以使用其中的任意一步返回作为结果!
比如:我们写了两个过程,一个是都加1,一个是完全累加!但是我们输出的不是最后一步,而是第二步!
最后一个知识点就是,在M函数中可以使用
// :单行注释/**/:多行注释
小结:
1、M函数上下文,一般可以使用 each _ 来观察
2、自定义函数,(x)=>计算表达式,可以解决上下文嵌套的问题
3、掌握let…… in ……结构和如何使用注释!
4、了解数据类型,为函数嵌套打下基础!
如果今天的内容你都已经完全掌握,那么恭喜你,你PQ中的M函数算是入门了!后面多练习,不久必有质的飞跃!
往期推荐
PQ 第一期 | Power Query是什么?怎么学?
PQ 第二期 | 懂Excel为什么还是学不好PQ?
END
相关推荐
- 10款超实用JavaScript音频库(js播放音频代码)
-
HTML5提供了一种新的音频标签实现和规范用一个简单的HTML对象而无需音频插件来控制音频。这只是一个简单的整合这些新的HTML5音频特征及使用JavaScript来创建各种播放控制。下面将介绍10款...
- PROFINET转Modbus网关——工业协议融合的智能枢纽
-
三格电子SG-PNh750-MOD-221,无缝连接Profinet与Modbus,赋能工业物联产品概述...
- 简单实用的Modbus类库,支持从站和DTU
-
一、简介...
- [西门子PLC] S7-200 SMART PROFINET :通过GSD组态PLC设备
-
从S7-200SMARTV2.5版本开始,S7-200SMART开始支持做PROFINETIO通信的智能设备。从而,两个S7-200SMART之间可以进行PROFINETI...
- Modbus(RTU / TCP)有什么异同(modbus tcp和tcp)
-
Modbus是一种广泛使用的工业自动化通信协议,它支持设备之间的数据交换。Modbus协议有两个主要的变体:ModbusRTU(二进制模式)和ModbusTCP(基于TCP/IP网络的模式)。尽管...
- Modbus通信调试步骤详解(modbus调试工具怎么用)
-
Modbus通信调试步骤详解 Modbus通信分为串口和以太网,无论是串口还是以太网,只要是标准Modbus,就可以用Modbus模拟器进行调试。按以下几步进行调试。...
- 理解Intel手册汇编指令(intel 汇编指令手册)
-
指令格式...
- 「西门子PLC」S7-200 SMART的Modbus RTU通讯
-
S7-200SMART集成的RS485端口(端口0)以及SBCM01RS485/232信号板(端口1)两个通信端口可以同时做MODBUSRTU主站,或者一个做MODBUSRTU主站一个做MO...
- InfiniBand网络运维全指南:从驱动安装到故障排查
-
一、InfiniBand网络概述InfiniBand(直译为“无限带宽”技术,缩写为IB)是一种用于高性能计算的计算机网络通信标准,具有极高的吞吐量和极低的延迟,用于计算机与计算机之间的数据互连。它...
- 一加回归 OPPO,背后的秘密不可告人
-
有这样一个手机品牌,它诞生于互联网品牌。在大众群体看来,它的身世似乎模糊不清,许多人以为它是国外品牌。它的产品定位是极客群体,深受国内发烧友,甚至国外极客玩家喜爱。...
- [西门子PLC] S7-200SMART快速高效的完成Modbus通信程序的设计
-
一、导读Modbus通信是一种被广泛应用的通信协议,在变频器、智能仪表还有其他一些智能设备上都能见到它的身影。本文呢,就把S7-200SMART系列PLC当作Modbus主站,把...
- 狂肝10个月手搓GPU,他们在我的世界中玩起我的世界,梦想成真
-
梦晨衡宇萧箫发自凹非寺量子位|公众号QbitAI自从有人在《我的世界》里用红石电路造出CPU,就流传着一个梗:...
- [西门子PLC] 博途TIA portal SCL编程基础入门:1-点动与自锁
-
一、S7-SCL编程语言简介...
- 工作原理系列之:Modbus(modbus工作过程)
-
MODBUS是一种在自动化工业中广泛应用的高速串行通信协议。该协议是由Modion公司(现在由施耐德电气公司获得)于1979年为自己的可编程逻辑控制器开发的。该协议充当了PLCS和智能自动化设备之间的...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
MacOS + AList + 访达,让各种云盘挂载到本地(建议收藏)
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
- 最近发表
-
- 10款超实用JavaScript音频库(js播放音频代码)
- Howler.js,一款神奇的 JavaScript 开源网络音频工具库
- PROFINET转Modbus网关——工业协议融合的智能枢纽
- 简单实用的Modbus类库,支持从站和DTU
- [西门子PLC] S7-200 SMART PROFINET :通过GSD组态PLC设备
- Modbus(RTU / TCP)有什么异同(modbus tcp和tcp)
- Modbus通信调试步骤详解(modbus调试工具怎么用)
- 理解Intel手册汇编指令(intel 汇编指令手册)
- 「西门子PLC」S7-200 SMART的Modbus RTU通讯
- InfiniBand网络运维全指南:从驱动安装到故障排查
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)