tft每日頭條

 > 生活

 > query函數用法

query函數用法

生活 更新时间:2025-02-01 15:56:26

這是我們PQ第三期,講完本期,基礎基本就畢業了,後面可能會對一下難點函數講解!M函數中由于沒有單元格概念,我們第二期所講,基本是“列操作”,整理公式完全一樣,那麼為什麼出來的結果又不一樣呢?因為同樣的公式在不同的環境下,效果不同,這裡的不同環境也就是我們要講的上下文!以上關于上下文新手肯定是不太好理解,具體我們還是結合案例來看一下!案例:給銷售添加一列金額我們先不直接添加金額,來看一下這裡的上下文問題!

query函數用法(Query中M函數基礎及上下文詳解)1

以上M函數公式有兩個新東西,一個是each 、一個是下劃線!先說一下他們組合在一起的時候,到底是什麼?

query函數用法(Query中M函數基礎及上下文詳解)2

我們在新窗口下輸入 -each _,不管是通過圖标還是下面的含義都可以看出他是一個函數(function)我們再看一下Tabe.AddColumn這個函數的幫助說明:

query函數用法(Query中M函數基礎及上下文詳解)3

要求是一個function 有就是需要一個函數,在M函數中參數為函數是非常常見的,大家以後會經常遇到!既然說到M函數,我們就來說一下M函數中的自定義函數如何表示?我們使用

(參數1as類型,參數2as類型……)=>計算表達式

來自定義函數當然可以看到我們舉例中的iSum函數x并沒有指定類型any類型(任意)

query函數用法(Query中M函數基礎及上下文詳解)4

其他相關類型如下:

query函數用法(Query中M函數基礎及上下文詳解)5

自定義函數我們先簡單了解,等我們說完上下文,回頭再談具體應用!現在我們就可以繼續聊上下文的事情了!在案例中,輸入完公式後我們會發現金額都是一個Record,點開第一個會發現 是當前行形成的一個記錄!這裡的上下文就是當前行,公式是基于每一個(each)行來寫的,我們可以使用當前行中任意列,或者不用,比如 each 1,表示都添加1!

query函數用法(Query中M函數基礎及上下文詳解)6

當然我們現在不能說,所有的上下文都是當前行,比如我們遍曆一個list,那麼對應的上下文可能就是每一個元素!

= List.Transform({1..10},each _ 1)

這裡的上下文其實是列表中的每一個元素!

query函數用法(Query中M函數基礎及上下文詳解)7

所以上下文和我們平時聊天的語境是一個意思!比如張三突然說:“我去啊”在不知道聊天的前後對話,我們完全無法肯定是什麼意思?但是當我們知道前面有人罵了一句張三,那麼這個“我去"可能就表示憤怒的意思。要是前面是一個美女問張三"你明天不去看電影嗎?",那麼意思則完全不同!聽完是不是感覺懂了,但是感覺寫M函數公式的時候又不知道怎麼用?其實大家不用擔心,我們現在就來說一招! 在M函數書寫過程中,當我們找發現一個參數是function類型,那麼肯定可以寫成each _,這個時候,我們就可以來觀察當前的上下文,也就是下劃線在當前上下文目前到底表示什麼的!比如案例中,當我們點擊第二行時發現是第二行的所形成的記錄!其他行都是如此!

query函數用法(Query中M函數基礎及上下文詳解)8

那麼我們的金額就好些了,就是使用當前上下文下的數量*單價,下劃線表示當前行,是一個記錄,那麼從記錄中獲取一項,我們是需要 記錄集[key]即可

= Table.AddColumn( 源,"金額",each _[單價]*_[ 數量])

query函數用法(Query中M函數基礎及上下文詳解)9

由于我們知道當前的上下文就是當前行,沒有其他幹擾(以後我們會學到上下文嵌套的問題),所以可以不寫下劃線

query函數用法(Query中M函數基礎及上下文詳解)10

前面我們學過 each _是函數fx(x)=>計算表達式也是函數,那麼這裡應該可以使用fx來處理!

= Table.AddColumn(源,"金額",(x)=>x[單價]*x[數量])

有其他語言基礎的同學,可能看出這個有點匿名函數的感覺 和js中的箭頭函數類型,當然我們也可以先定義一個具名函數再調用,都是一樣的!

query函數用法(Query中M函數基礎及上下文詳解)11

在有上下文嵌套的情況下,一般我們需要考慮使用自定義函數,因為一個下劃線無法區分開!常見的案例就是累加問題!1-10依次累加!

query函數用法(Query中M函數基礎及上下文詳解)12

query函數用法(Query中M函數基礎及上下文詳解)13

以上就存在上下文嵌套問題!我們的思路,把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 中=> 是自定義函數表示方式,不是大于等于的意思,第二個 <= 是真的小于等于的含義!

query函數用法(Query中M函數基礎及上下文詳解)14

each _ 其實是一種語法糖,自定義函數的一種簡化寫法!最後我們補充一下let …… in …… 結構,M基礎篇就算完結了!

query函數用法(Query中M函數基礎及上下文詳解)15

當我們要處理的邏輯比較複雜的時候,一般我們會通過高級編輯器來寫,在其中我們使用

let 處理過程 in 結果

處理過程可以是多步,每步直接使用逗号隔開,後面的寫的可以調用前面已經寫好的任意過程(不用完全連續)!結果 一般使用最後一步,但是我們可以使用其中的任意一步返回作為結果!比如:我們寫了兩個過程,一個是都加1,一個是完全累加!但是我們輸出的不是最後一步,而是第二步!

query函數用法(Query中M函數基礎及上下文詳解)16

最後一個知識點就是,在M函數中可以使用

// :單行注釋/**/:多行注釋

小結:

1、M函數上下文,一般可以使用 each _ 來觀察

2、自定義函數,(x)=>計算表達式,可以解決上下文嵌套的問題

3、掌握let…… in ……結構和如何使用注釋!

4、了解數據類型,為函數嵌套打下基礎!

如果今天的内容你都已經完全掌握,那麼恭喜你,你PQ中的M函數算是入門了!後面多練習,不久必有質的飛躍!

往期推薦

PQ 第一期 | Power Query是什麼?怎麼學?

PQ 第二期 | 懂Excel為什麼還是學不好PQ?

query函數用法(Query中M函數基礎及上下文詳解)17

END

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved