Power Query系列 - 排序Ranking


Power Query系列 - 排序Ranking

難度: ★☆☆☆(1星)

適用范圍: ★(3星)

 

概況:

在數據分析中,我們常常需要對數據進行排序,同時我們想知道某個項目或者產品的排名,以方便查閱或對排名靠前的進行特別處理。

 

應用場景:

以下是幾個應用場景:

  • 對前五名銷售進行獎勵
  • 對前五名的銷售求和
  • 對末3位進行淘汰
  • ....

 然鵝,排名有多種,下面是小抄: 

 

 

  •  順序排序(1234排序)-這種排序方法對數據的每一行使用序號,而不關心平局/並列。
  •  標准比賽排名(1224排序)-也稱為跳過排名的一種形式,該方法為平局分配相同的排名,並且跳過下一個排名值。 在這種情況下,我們的值分別變為1,2,2,4,5 。
  •  修改后的比賽排名(1334排序)-與標准比賽排名方法類似,但是跳過的值位於平局之前 。 在這種情況下,我們將得到1,3,3,4,5
  •  密集排名(1223排序)-在這種排名方法中,平局/並列(一樣的值)具有相同的排名,但不會跳過下一個值。 在這種情況下,我們有1,2,2,3,4,5。
  •  分數排名(1/2.5/2.5/4排序)-這個排名我還沒有見過或用過。

 

那么,如何在Power Query中進行構建,以便可以在Excel和Power BI和中顯示它們呢?

 

 最終Excel效果顯示如下

 

 歡迎轉載,請保留原文鏈接和作者信息。O(∩_∩)O謝謝。

Power Query系列 - 排序Ranking
作者:馬丁叔叔             鏈接:http://www.cnblogs.com/lizardbi/p/PowerQuery-POWERBI-Ranking.html

 數據模型:

 要點:

  • 何時加入索引Index
  • 用什么分組Grouping方法

 一起來實現各種排名方法吧! 

如果下載附件,您將看到它具有上面顯示的完整的Excel表格。 為了簡化說明,以下步驟只選取了兩列作為SalesData表: 

在Excel表格中選擇一個單元格->數據->從表格/范圍 

選擇項目和銷售列->右鍵單擊->刪除其他列 

僅作為連接加載 

這給了我一個簡單的表,其中僅包含產品名稱和值,如下所示: 

 

產品 銷售
Comvita 康維他 500
Avitago兒童蜂膠 400
同仁堂蜂蜜 400
Aurinda 澳琳達 200
By-Health 湯臣倍健 100

如您所見,銷售列已經按降序排序,這是我們對並列排名的關鍵所在。 

  

對於每種排名方法-我們實際上將通過以下方式開始每個新查詢(Query): 

引用SalesData查詢 (Reference)

重命名新查詢以表示所展示的排名方法 

 

這意味着我將基於上面的視圖每次給出步驟,因為這是我們從引用步驟中應該得到的。 

 

排名方法1:順序排名(1234排序) (Ordinal Rank)

這種排名方法非常容易創建: 

按降序對“銷售”列進行排序 

按升序對“項目”列進行排序(按字母順序對關系進行排名) 

轉到添加列->索引列->從1開始 

重命名索引列為排名 

根據需要重新排列列 

對,就醬。 它只是向您的數據排序方式添加了一個行號,如下所示: 

 

let
    Source = SalesData,
    #"Removed Columns" = Table.RemoveColumns(Source,{"順序排名", "標准競賽排名", "修改競爭排名", "密集排名", "分數排名"}),
#"Added
Index" = Table.AddIndexColumn(#"Removed Columns", "Index", 1, 1) in #"Added Index"

結果如下:

 

 

Avitago兒童蜂膠同仁堂蜂蜜在列表中排名第2和第3,但銷售均為400,而默認按照字母順序,分別獲得第2和第3的排名,而Aurinda 澳琳達按銷售排第4。

當然,可以加入相同銷售額的時候按照名字倒敘排名,同仁堂排第2,Avitago排第3。

 

排名方法2:標准比賽排名 (1224 排序)(Standard Competition Rank)

這種排名方法涉及使用一些分組以使值正確顯示: 

按降序對“銷售”列進行排序 

添加索引列,從1開始 

轉到轉換->組 

按銷售列分組 

創建以下列: 

使用“索引”列上的“最小”運算的排名 

使用“所有行”操作的數據 

展開項目列 

根據需要重新排列列 

let
   Source = SalesData,
   #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1),
   #"Grouped Rows" = Table.Group(#"Added Index", {"銷售"}, {{"Rank", each List.Min([Index]), type number}, {"Data", each _, type table}}),
   #"Expanded Data" = Table.ExpandTableColumn(#"Grouped Rows", "Data", {"產品"}, {"產品"}),
   #"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "銷售", "Rank"})
in
   #"Reordered Columns"

結果如下:

 

 

結果正確地表明,Avitago兒童蜂膠同仁堂蜂蜜在列表中排名第2和第3,但銷售均為400,故此,分別獲得第2的排名,而Aurinda 澳琳達(在列表中排名第4)的排名為4,因為並列第二名,故沒有第三名。 

 

排名方法3:修改后的比賽排名 (1334排序)(Modified Competition Rank)

要按照修改后的比賽排名方法創建排名,我們需要: 

按降序對“銷售”列進行排序 

添加索引列,從1開始 

轉到轉換->組 

按銷售列分組 

創建以下列: 

使用“索引”列上的“最大”運算的排名 

使用“所有行”操作的數據 

展開項目列 

根據需要重新排列列 

let
   Source = SalesData,
   #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1),
   #"Grouped Rows" = Table.Group(#"Added Index", {"銷售"}, {{"Rank", each List.Max([Index]), type number}, {"Data", each _, type table}}),
   #"Expanded Data" = Table.ExpandTableColumn(#"Grouped Rows", "Data", {"產品"}, {"產品"}),
   #"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "銷售", "Rank"})
in
   #"Reordered Columns"

此排名方法與標准競爭排名之間的唯一區別是,我們使用“索引”列的“最大值”而不是先前方法中使用的“最小值”來創建“排名”列。 

 

 

 結果表明,Avitago兒童蜂膠同仁堂蜂蜜在列表中排名第2和第3,但銷售均為400,故此,分別獲得第3的排名,而Aurinda 澳琳達(在列表中排名第4)的排名為4。因為並列第三名,故沒有第二名。

 

排名方法4:密集排名(1223排序)(Dense Rank) 

密集排名方法要求更改標准競爭排名方法中步驟的順序。 也就是說,Group By命令必須在添加Index列之前出現: 

按降序對“銷售”列進行排序 

轉到轉換->組 

按銷售列分組 

創建以下列: 

使用“所有行”操作的數據 

添加索引列,從1開始

展開項目列 

根據需要重新排列列 

let
   Source = SalesData,
   #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1),
   #"Grouped Rows" = Table.Group(#"Added Index", {"銷售"}, {{"Data", each _, type table}}),
   #"Added Index1" = Table.AddIndexColumn(#"Grouped Rows", "Index", 1, 1),
   #"Expanded Data" = Table.ExpandTableColumn(#"Added Index1", "Data", {"產品"}, {"產品"}),
   #"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "銷售", "Index"}),
   #"Renamed Columns" = Table.RenameColumns(#"Reordered Columns",{{"Index", "Rank"}})
in
   #"Renamed Columns"

此方法將產生以下結果: 

 

 

 

結果正確地表明,Avitago兒童蜂膠和同仁堂蜂蜜在列表中排名第2和第3,但銷售均為400,

故此,分別獲得第3的排名,而Aurinda 澳琳達(在列表中排名第4)的排名為3。

這里與競賽排名和修改后競賽排名不同之處在於,

這里不會跳過任何一位的排名數字。 

 

排名方法5:分數排名 (Fractional Rank)

就像我一開始提到的那樣,我發現這是最奇怪的排名方法之一。

但是,像上面其他的一樣,創建它非常容易。  

按降序對“銷售”列進行排序 

添加索引列,從1開始

轉到轉換->組 

按銷售列分組 

創建以下列: 

使用“索引”列上的“平均”運算的排名 

使用“所有行”操作的數據 

展開項目列 

根據需要重新排列列 

let
   Source = SalesData,
   #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1),
   #"Grouped Rows" = Table.Group(#"Added Index", {"銷售"}, {{"Rank", each List.Average([Index]), type number}, {"Data", each _, type table}}),
   #"Expanded Data" = Table.ExpandTableColumn(#"Grouped Rows", "Data", {"產品"}, {"產品"}),
   #"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "銷售", "Rank"})
in
   #"Reordered Columns"

結果如下:

 

 

這個,你在哪里用到過……? 

 

 

總結 

實際上,可以看到,僅對應用分組Grouping方法時所選擇的步驟順序,並且/或者,匯總時進行一些小的修改即可輕松地更改排名方法:

譬如,有的先加入索引列,有的后加;有的用最大值,有的用最小值,有的用平均值。

但是,

如果你熟悉了這些,任何排序方法都難不倒你了!! 

 

當然我們可以使用Excel公式創建每種排名方法,

但,文中的方法用Power Query實現,

醬,我們可以將結果直接加載到Power Pivot或者Power BI中。

(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM