如果你也和我一樣懶得去思考那堆有的沒的函數式,事實上,前面提及Power Query編輯器,本身的操作介面就可以把一連串的資料轉換做函數,但這邊還是至少要知曉M語言可以為我們做甚麼。
當你需要了解一個處理資料的語言時,需要弄清楚這個語言定義的資料型態,以正確有效的處理資料。M查詢的內容可以是定義特定函數,然後透過其他查詢呼叫,重複使用轉換資料整理的商業邏輯,進而結構化設計M查詢
特過M定義函數把其他結果當作參數輸入,重複利用轉換資料的定義,其格式如下:
let
變數 = (參數列表) =>搭配參數的運算式
in
變數
或是更進一步的階層運算示範地回呼叫函數,由於遞迴要呼叫自己,故在呼叫的函數名稱前面加上@符號,執行格式如下:
let
Factorial = (n) =>if n <= 1 then 1 else n * @Factorial (n-1) //遞迴呼叫
in
Factorial
以範例解釋上述定義與呼叫函数,add 是變數名稱,指向個函數定義。(x,y)是要傳入函數運算式的參數,而=>符號後方則函數要執行的運算。最後回傳不指定參數值2和3,代表傳回函數定義,而非計算結果。在「Power Query編輯器」輸入的M語法下:
let
add = (x,y) => x+y
in
add(2,3)
要注意的是在呼函數時,使用的是查詢的名稱,此為「查詢1」。可以再建立一個空白查詢,以某個查詢呼叫另一個當作函数的查詢,即前面的呼叫自己,這時該查詢將命名為「階層」。
以查詢運算結果產生的資料結構呼叫自訂函數
let
來源=Table.FromRecords ({[c1=1],[c1=2],[c1=3],[c1=4]}),
叫用自訂函數=Table.AddColumn(來源,“查詢1",each階層([c1]))
in
叫用自訂函數
「來源」變數從Table.FromRccords函數取回的表格而後透過Table.AddColumn 函數為表格新增一個資料行。然而是該函數的第三個參數需要输入的是另外一個,以計算新增資料行對應每筆應有的值,此處的each就是關鍵,來建立匿名函數
each階層([c1])
該匿名函數的内容就是呼叫先前建立的「階層」函數,並傳入每一筆紀錄。而「階層」函數只取每筆錄C1欄位當作參數計算結後回傳的值就是「查詢1」資料行在該筆紀錄的值。