在我們操作過程中芭概,使用分組依據(jù)進(jìn)行匯總計(jì)算的操作應(yīng)該是非常的多的赛不,我們對(duì)于這個(gè)函數(shù)還是非常有必要深入了解下。
Table.Group
按為每行指定的列?key?中的值對(duì)?table?的行進(jìn)行分組罢洲。 對(duì)于每個(gè)組踢故,將構(gòu)造一條記錄,其中包含鍵列(及其值)以及由?aggregatedColumns?指定的任何聚合列惹苗。 注意殿较,如果多個(gè)鍵與比較器匹配,將返回不同的鍵桩蓉。此函數(shù)無法保證返回固定的行順序淋纲。 或者也可以指定?groupKind?和?comparer。
Table.Group(table as table, key as any, aggregatedColumns as list, optional groupKind as nullable number, optional comparer as nullable function) as table
示例:對(duì)表進(jìn)行分組院究,同時(shí)添加一個(gè)聚合列 [total]洽瞬,其中包含價(jià)格總和("each List.Sum([price])")。
用法:Table.Group(Table.FromRecords({[CustomerID= 1, price = 20], [CustomerID= 2, price = 10], [CustomerID= 2, price = 20], [CustomerID= 1, price = 10], [CustomerID= 3, price = 20], [CustomerID= 3, price = 5]}), "CustomerID", {"total",each List.Sum([price])})
輸出:Table.FromRecords({ [CustomerID= 1, total = 30], [CustomerID= 2, total = 30], [CustomerID= 3, total = 25]}, {"CustomerID", "total"})
以上是系統(tǒng)給出的這個(gè)函數(shù)的解釋业汰,初學(xué)者不一定能看得懂伙窃,那我們一步一步來分析這個(gè)函數(shù)。
此函數(shù)共有5個(gè)主要參數(shù)样漆。Table.Group(Table为障,key as List,aggregatedColumns as function放祟,groupKind鳍怨,comparer),其中只有3個(gè)是必填參數(shù)跪妥。
第一個(gè)必填參數(shù):我們很好理解鞋喇,是從哪個(gè)表進(jìn)行操作。
第二個(gè)必填參數(shù):是根據(jù)哪列數(shù)據(jù)進(jìn)行分組骗奖,可以任意格式确徙。參數(shù)必須要填寫醒串,但是可以是空列表{},只有在不需要值來計(jì)算時(shí)可以使用鄙皇。例如_,Table.RowCount等
第三個(gè)必填參數(shù):怎么進(jìn)行分組操作芜赌,是一個(gè)函數(shù)公式。
第四個(gè)可選參數(shù):1=全局分組;0=局部分組(分組到下一條不等值為止)
第五個(gè)可選參數(shù):目前所知是有2個(gè)參數(shù)組成的函數(shù)(x,y)其中X為每次分組后的第一行;Y為X當(dāng)前行及下面的每一行伴逸。通常用(x,y)=>Number.From()固定格式來處理所判斷后的條件值缠沈。
第三參數(shù)aggregatedColumns書寫格式
={{新標(biāo)題}, each 函數(shù) ,type 類型}
={{"新標(biāo)題1",each 函數(shù)},{"新標(biāo)題2", each 函數(shù)}}
={{"新標(biāo)題1", each 函數(shù), type 類型},{"新標(biāo)題2",each 函數(shù), type 類型}}
={{"求和", each List.Sum([成績]), type number},{"計(jì)數(shù)", each List.Count([學(xué)科]), type number}}
我們來舉幾個(gè)例子:
分組匯總計(jì)算各學(xué)生的總分。
=Table.Group(源,"姓名",{"成績", each List.Sum( [成績]), type number})
如果需要對(duì)求和后的成績做一個(gè)類型定義错蝴,可以這樣寫
=Table.Group(源,"姓名",{"成績", each List.Sum( [成績]), type number })
把這個(gè)原表作為一個(gè)table類型顯示在新表里洲愤。
=Table.Group(源,{},{"新標(biāo)題", each _})
除了普通的函數(shù)計(jì)算,還有很多其他的函數(shù)可以應(yīng)用顷锰,例如格式轉(zhuǎn)換柬赐。
=Table.Group(源,"姓名",{"考試科目", each Text.Combine([學(xué)科],"/")})
主要的3個(gè)必填參數(shù)使用我們基本已經(jīng)了解,那我們來說下第四參數(shù)官紫,全局分組和局部分組肛宋。默認(rèn)省略的情況下是作為全局分組,參數(shù)為1束世。如果需要局部分組酝陈,參數(shù)為0的話,我們可以看下同樣的數(shù)據(jù)源有什么樣的變化毁涉。
我們可以看第三張圖沉帮,如果第四參數(shù)選擇0,張三這個(gè)姓名沒有進(jìn)行分組統(tǒng)計(jì)贫堰,而王五這個(gè)姓名有分組穆壕,這個(gè)是為什么呢?
全局分組=無重復(fù)匯總=參數(shù)為1
局部分組=連續(xù)匯總=參數(shù)為0
因?yàn)橥跷暹@個(gè)名字是連續(xù)一起的严嗜,所以局部分組的時(shí)候就進(jìn)行了操作粱檀,而張三這個(gè)姓名因?yàn)槭歉糸_的洲敢,所以就沒有進(jìn)行分組計(jì)算漫玄,所有分開的都作為單個(gè)分組依據(jù)。
第四參數(shù)的全局匹配和局部匹配我們了解后压彭,那我們來看下第五個(gè)參數(shù)睦优。
第五個(gè)參數(shù)是一個(gè)匹配函數(shù),有2個(gè)參數(shù)壮不,我們暫定為x,y汗盘。通常用(x,y)=>Number.From()固定格式來處理所判斷后的條件值。
X代表每一個(gè)分組的第一行询一,Y為X當(dāng)前行及下面的每一行隐孽。
我們來看下如果上面這個(gè)案例把第五參數(shù)填進(jìn)去會(huì)發(fā)生什么癌椿?
我們先測(cè)試X參數(shù),我們先把x="張三"這個(gè)條件放入進(jìn)第五參數(shù)中菱阵。我們可以看到踢俄,如果把參數(shù)填寫成張三,顯示的結(jié)果是張三80晴及,李四93.75都办。這個(gè)數(shù)據(jù)是怎么來的呢?
如果只匹配X的話虑稼,他的規(guī)則是從第一個(gè)開始連續(xù)匹配琳钉,如果不滿足條件即結(jié)束。意思就是指X從第一個(gè)開始配蛛倦,如果符合就顯示并計(jì)算歌懒,同時(shí)再往下一個(gè)進(jìn)行匹配;如果不符合則結(jié)束匹配溯壶,并顯示所匹配的這行數(shù)據(jù)的匹配值歼培,并把剩余的數(shù)據(jù)全部按公式計(jì)算。
X="張三"
X匹配到了第一個(gè)張三茸塞,則顯示張三躲庄,并計(jì)算80分的平均值,顯示80钾虐。
然后繼續(xù)匹配下一條噪窘,結(jié)果不等于張三則計(jì)算剩余數(shù)據(jù)。顯示這一行去匹配的數(shù)據(jù)"李四"效扫,并計(jì)算剩余數(shù)據(jù)的平均數(shù)(90+100+90+95)/4=93.75
X="李四"
X匹配第一個(gè)不等于李四倔监,則返回顯示李四并計(jì)算剩余數(shù)據(jù)的平均數(shù)(80+90+100+90+95)/5=91
我們可以看,只要是不配的數(shù)據(jù)菌仁,都是返回張三91
講完了X我們?cè)賮砜聪耏參數(shù)
我們把y參數(shù)填寫張三進(jìn)行匹配
顯示張三90和張三95浩习,第一個(gè)張三是匹配到當(dāng)前往下直到不滿足條件為止計(jì)算所包含的數(shù)據(jù)(80+90+100+90)/4,第二個(gè)張三是匹配到最后一個(gè)張三济丘,因?yàn)橐呀?jīng)是最后一條谱秽,所以顯示95。
我們把y參數(shù)填寫成王五進(jìn)行匹配
顯示第一個(gè)張三85摹迷,第二個(gè)王五100疟赊,第三個(gè)王五92.5
因?yàn)榈谝粋€(gè)y顯示王五的是在第三行,所以返回顯示第一個(gè)匹配值張三峡碉,并計(jì)算顯示截至匹配到王五位置的行之前的值(含匹配行)進(jìn)行計(jì)算近哟。(80+90)/2,找到王五匹配值后計(jì)算100/1鲫寄,第三個(gè)王五匹配值后計(jì)算(90+95)/2
通過以上示例我們可以大致可以了解到Table.Group這個(gè)函數(shù)的用法