电竞比分网-中国电竞赛事及体育赛事平台

分享

Power BI Power Query 排名-非連續(xù)排名和連續(xù)排名

 zonge 2022-07-21 發(fā)布于湖北

使用Power Query來進行排名操作。

image

非連續(xù)排名

首先我們來實現(xiàn)非連續(xù)排名,非連續(xù)排名最終排出來的名次的數(shù)字是非連續(xù)的,假如第1名1人,第2名有2人,那么名次為3的人事不存在的,而只有從第4名開始。

這種模式的計算邏輯是:對于某一個得分而言,其名次為大于當(dāng)前分數(shù)的所有人的個數(shù)+1

1、首先我們將Excel表數(shù)據(jù)導(dǎo)入到Power Query管理器中,選擇表數(shù)據(jù)區(qū)域,然后依次點擊“數(shù)據(jù)/從表格”,彈出的對話框直接點確認

image image

image

2、接下來依次點擊“添加列/自定義列”,我們首先借助于這個自定義列來為每一行獲取一個子表,該子表包含了所有比當(dāng)前行的分值大的所有行。

在自定義列窗體中的配置如下圖所示,其中的公式為:

=Table.SelectRows(更改的類型,(r)=>r[分數(shù)]>[分數(shù)])

image

說明下公式:

1、使用Table.SelectRows函數(shù)來挑選出表中的行

2、Table.SelectRows函數(shù)的第1個參數(shù):指明從哪個表里挑選數(shù)據(jù),這個表是上一個步驟得到的結(jié)果,上一個步驟就是右側(cè)查詢設(shè)置步驟清單中的“更改的類型”

3、Table.SelectRows函數(shù)的第2個參數(shù):該參數(shù)是一個lambuda函數(shù)表達式,該函數(shù)表達式將會被逐行應(yīng)用到Table.SelectRows函數(shù)的第1個參數(shù)表的每一行之上。

(r) :這部分是lambuda函數(shù)的參數(shù)部分,其中的r是參數(shù)的名稱,你可以使用任何字母,它表示的就是遍歷參數(shù)表的行,你需要區(qū)分它與整個公式計算所在的當(dāng)前行之間的差異。

        拿計算列的第1行為例,當(dāng)前自定義列的公式所在的行是第1行,而這個lambuda函數(shù)將會遍歷表的所有行,每次都取一行的值與當(dāng)前行(第1行)的分數(shù)比較,我這里的表有100行,所比較操作就有100次;

        后面計算列的所有行都是相同處理,所以需要運算的次數(shù)為100*100=10000次。

=>:箭頭符號,用來分隔lambuda函數(shù)的參數(shù)部分和邏輯代碼部分

r[分數(shù)]>[分數(shù)]:lambuda函數(shù)的邏輯代碼部分,該部分需要返回一個邏輯值,以便于Table.SelectRows函數(shù)判定是否需要挑選(篩選)出表中的行,返回結(jié)果為真時,表示挑選出來,否則過濾掉改行

       其中的r[分數(shù)]表示的取當(dāng)前遍歷行中的分數(shù)列的值,而大于符號后面的[分數(shù)]表示的是自定義列公式所處行中的分數(shù)列的值

關(guān)于為何使用的是r[分數(shù)]來獲取分數(shù)列的值,而不是使用r{[分數(shù)]}來訪問這個值,是因為表(Table)中的行其數(shù)據(jù)類型是記錄(Record)。

下圖是添加自定義列“子表”之后的運行結(jié)果,我們可以點擊第1行,底部就會加載該子表的數(shù)據(jù)

image

注意:不要點在哪個Table文字上,而是點在右側(cè)空白區(qū)域里,點在文字上,PQ將會認為你是要新加一個步驟查看該子表的數(shù)據(jù)了

接下來就需要將子表中的行統(tǒng)計一下,計算出總行數(shù),并將該數(shù)字+1即可得出排名了,下面我們直接在前面的公式上修改

1、在右側(cè)找到最后的操作步驟,右側(cè)有一個齒輪圖表,點擊一下它,就可以重新彈出“自定義列”對話框

image

2、輸入如下所示的公式,點擊確定按鈕后,會看到如下面右側(cè)圖片所示的排名結(jié)果。

=Table.RowCount(Table.SelectRows(更改的類型,(r)=>r[分數(shù)]>[分數(shù)]))+1

image image 

3、依次點擊“主頁/關(guān)閉并上載至”,依次選擇“表/新建工作表”,點擊加載按鈕后,將我們的排名查詢加載到Excel中,后續(xù)原始數(shù)據(jù)變動時,我們只需要刷新一下即可得到新的排名

image image

連續(xù)排名

連續(xù)排名最終排序得到排名的名次是連續(xù)的,假如第1名1人,第2名有2人,那么接下來的名次并非從第4名開始,而是還是第3名。

連續(xù)排名的邏輯:對于序列之中的某個分數(shù)而言,其名次是序列中大于該分數(shù)值的所有非重復(fù)分值的個數(shù)+1 

之前的示例數(shù)據(jù)我是通過隨機數(shù)方式生成的,制作本示例時,數(shù)據(jù)發(fā)生了變化,示例數(shù)據(jù)如下所示:

image

先說明下思路:

借助于自定義列來為每一行獲取一個子表,該子表包含了所有比當(dāng)前行的分值大的所有分值的非重復(fù)記錄。

1、首先從表中挑選出比當(dāng)前行分數(shù)大的所有記錄行(與非連續(xù)排名一樣)

2、然后從上面第1步得到的表中再挑選出“分數(shù)”列

3、再在上面第2步得到的“分數(shù)”列中取一個非重復(fù)值

與前面進行非連續(xù)排名的操作類似,前面的導(dǎo)入數(shù)據(jù)操作步驟是一樣的,所以這里我跳過這些步驟。直接演示上面所說的1-3步的實現(xiàn)

1、新建自定義列,錄入公式如下:(與非連續(xù)排名的公式一樣)

=Table.SelectRows(更改的類型,(r)=>r[分數(shù)]>[分數(shù)])

image

2、將公式修改為如下結(jié)果,公式輸入完畢后,注意圖中觀察左下角子表的表現(xiàn)形式

=Table.SelectColumns(Table.SelectRows(更改的類型,(r)=>r[分數(shù)]>[分數(shù)]),"分數(shù)")

image

說明下公式:

1、首先我使用Table.SelectRows函數(shù)來過濾表中的行,得到分數(shù)大于當(dāng)前分數(shù)的記錄行,注意這些篩選后的記錄行構(gòu)成了一個新的表,它可以作為下一個Table.SelectColumns函數(shù)的參數(shù)

2、然后再使用了Table.SelectColumns函數(shù)來從上一步過濾后的表中挑選出“分數(shù)”列

3、Table.SelectColumns函數(shù)第1個參數(shù):數(shù)據(jù)類型為表,函數(shù)將從該表中挑選出列來

4、Table.SelectColumns函數(shù)第2個參數(shù):當(dāng)是字符串時,從表中提取出單列,當(dāng)是列表是,從表中提取出多了,例如{“索引”,”分數(shù)”},表示從表中提取2列

3、接下來繼續(xù)改造公式,將公式修改為如下形式,其含義是在分數(shù)列上求一個非重復(fù)值,注意觀察示意圖左下角的分數(shù)列結(jié)果

=Table.Distinct(Table.SelectColumns(Table.SelectRows(更改的類型,(r)=>r[分數(shù)]>[分數(shù)]),"分數(shù)"))

image

4、最后再在最外面套一個求行數(shù)的函數(shù),并將結(jié)果+1即可得到連續(xù)排名的名次值

=Table.RowCount(Table.Distinct(Table.SelectColumns(Table.SelectRows(更改的類型,(r)=>r[分數(shù)]>[分數(shù)]),"分數(shù)")))+1

image

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多