BI探検ノート

Power BI で順位を出す方法(RANKX):同率で順位が飛ぶ・全部が1位になるとき

約4分

濵口 翔長崎で、Power BI のつまずきを記録しています
目次
  1. 使ったデータ
  2. 公式の説明
  3. 作ったメジャー
  4. 実機で確かめた結果
  5. どちらを使うか
  6. この記事で確認できたこと・できていないこと
  7. 参考

確認日2026年10月27日。Power BI Desktop 2.159.883.0(日本語、Windows)、ダミーのデータ6行で確かめました。確認できていないことは、末尾にまとめました。

商品別の売上に、順位をつけたい。DAX の RANKX を使うと、メジャーで順位を出せます。ところが、同率の商品がいると順位が飛ぶこと、書き方によっては、全部が1位になることが、実機で見えました。結果を、書きます。

結論(30秒版)

  • 順位 = RANKX(ALL(rank_demo[商品]), [売上合計]) で、売上の大きい順に、順位が付きました。
  • 同率のとき、既定(Skip)では、「1・2・2・4」のように、次の順位が飛びます。Dense を指定すると、「1・2・2・3」になりました。
  • ALL を付けずに、RANKX(rank_demo, [売上合計]) と書くと、全部が1位になりました。

使ったデータ

6商品の売上です。500が2つ、300が2つの、同率があるデータにしました。

商品売上
コーヒー800
緑茶500
紅茶500
水300
牛乳300
ジュース200

公式の説明

Microsoft Learn の RANKX の説明では、書式は RANKX(<table>, <expression>[, <value>[, <order>[, <ties>]]]) です。

  • order: 省略すると、降順(いちばん大きい値が1位)。
  • ties(同率の扱い): 省略すると Skip。同率のあとの順位は、「同率の順位+同率の数」になる(例: 5つが11位なら、次は16位)。Dense にすると、同率のあとの順位は、「次の順位」(例: 5つが11位なら、次は12位)。

作ったメジャー

売上合計 = SUM(rank_demo[売上])
順位(既定) = RANKX(ALL(rank_demo[商品]), [売上合計])
順位(Dense) = RANKX(ALL(rank_demo[商品]), [売上合計], , DESC, Dense)
順位(ALLなし) = RANKX(rank_demo, [売上合計])

テーブルのビジュアルに、商品と、この4つのメジャーを入れ、「売上合計」の見出しをクリックして、売上の大きい順に並べました。

実機で確かめた結果

商品別の売上と、3つの順位。既定は 1・2・2・4・4・6、Dense は 1・2・2・3・3・4、ALL なしは全部 1

商品売上合計順位(既定)順位(Dense)順位(ALLなし)
コーヒー800111
紅茶500221
緑茶500221
牛乳300431
水300431
ジュース200641

同率のとき、順位が飛ぶ(既定)

500 が2つで、どちらも2位。次の 300 は、3位ではなく、4位(2位+同率の数2)になりました。その次の 200 は、6位(4位+2)です。公式の説明のとおり、既定の Skip の動きでした。

Dense にすると、飛ばない

Dense を指定すると、「1・2・2・3・3・4」になりました。ジュースは、4位です。

ALL を付けないと、全部が1位

RANKX(rank_demo, [売上合計]) と書くと、全部が1位になりました。ビジュアルの行ごとに、その商品だけに絞られた状態で、テーブル全体の順位を数えるので、比べる相手が、自分だけになったためだと考えています(私の説明で、公式の記載を確認したものではありません)。ALL(rank_demo[商品]) で、商品に対するフィルターを外して、全商品の中での順位にします。

合計行は、1になる

テーブルの「合計」の行は、どの順位のメジャーも、1でした。合計は、商品を絞らない1行なので、意味のある順位ではありません。表に出したくない場合は、書式設定で、合計行を非表示にできます(合計行を消す方法)。

どちらを使うか

やりたいこと書き方
同率は同じ順位で、次は飛ばしたい(スポーツの順位のように)既定(Skip)
同率でも、順位を詰めたい(「上位3位まで」を、同率を含めて数えたいなど)Dense

この記事で確認できたこと・できていないこと

確認日: 2026年10月27日。Power BI Desktop 2.159.883.0(日本語、Windows、未サインイン、個人の環境)。

確認できたこと

  • 6行のデータで、既定(1・2・2・4・4・6)、Dense(1・2・2・3・3・4)、ALL なし(全部1)になったこと。
  • 公式の説明(Skip と Dense の違い)と、実機の動きが一致したこと。

確認できていないこと

  • 複数の列(店舗と商品の組み合わせ)での順位、スライサーで絞り込んだときの順位の動き(ALLSELECTED を使う場合)。
  • 昇順(ASC)での順位。
  • 売上が、空白(BLANK)の行がある場合(公式には、「空白は0として扱われる」と書かれています)。
  • 大きなデータでの速さ、DirectQuery、Power BI サービスでの動き。
  • 「ALL を付けないと全部1位になる」理由の説明は、私の推測です。

参考