power bi インデックス列 daxを使いこなす実務ガイド(作り方、使いどころ、落とし穴まで)

🎯 Power BIを本格的に学びたい方へ

初心者から上級者まで、あなたのレベルに合わせたソリューションをご用意

初級編

ハンズオンセミナー
基礎編

Power BIの基礎を1日でマスター。データ取り込みから可視化まで実践形式で学べます。

  • データ取り込みの基本
  • レポート作成の流れ
  • 基本的なビジュアル作成
📚 初級編の詳細を見る

⭐ 満足度98% | 毎月開催

中・上級編

ハンズオンセミナー
DAX関数編

DAX関数を中心に、より高度なデータ分析とモデル設計を習得できます。

  • DAX関数の実践活用
  • データモデル設計
  • 高度な分析手法
🚀 中級編の詳細を見る

🎯 実践的な分析スキル習得

企業向け

Power BI 導入支援・構築
コンサルティング

経験豊富なコンサルタントが、御社の課題に合わせたPower BI導入を全面サポート。

  • 大手から中小まで30社以上の導入実績
  • 延べ3,000名以上のセミナー開催実績
  • 課題ヒアリングから運用定着まで伴走
💼 導入支援を相談する

📞 無料相談可 | 御社の課題をお聞かせください

Power BIでレポートを作っていると、ある時点で「行に番号を振りたい」「表示順を固定したい」「同じグループの中で1番目、2番目を作りたい」「前の行と比較したい」といった要望が必ず出てきます。こういう場面で登場するのがインデックス列です。

ただし、Power BIのインデックス列には複数の作り方があり、目的に合わない方法を選ぶと、数字が合わない、並びが安定しない、更新が遅い、リレーションが壊れる、といったトラブルにつながります。特に「DAXでインデックス列を作る」場合は、Power BIが基本的に“行の順番を持たない”世界で動いていることを理解しておく必要があります。

この記事では、power bi インデックス列 daxを中心に、Power Queryで作る場合との使い分け、よくある用途、よくある失敗、安定させるコツを、できるだけ分かりやすく整理します。

インデックス列が必要になる代表的な場面

インデックス列が欲しくなるのは、だいたい次のパターンです。

  1. 並び順を固定したい
    月名を4月始まりで並べたい、ステータスを「新規→提案→見積→受注」の順にしたい、カテゴリを任意の順で出したい、など。

  2. 同じグループの中で順番を付けたい
    顧客ごとの購入履歴に1番目、2番目を付ける。社員ごとの異動履歴に時系列の番号を付ける。チケットごとのステータス遷移に順番を付ける、など。

  3. 直前の行と比較したい
    前回購入から何日空いたか、前回のスコアとの差分、直前イベントからの経過時間、など。

  4. 上位N件や最新1件を取りたい
    顧客ごとの最新購入1件だけ、設備ごとの直近点検1件だけ、案件ごとの最終ステータスだけ、など。

  5. テーブルやマトリクスで「行番号」を表示したい
    見た目の要望として「1行目から番号を振ってほしい」というケース。

この中で、どれに当てたいかで、Power Queryで作るべきか、DAXで作るべきかが変わります。

まず押さえるポイント:DAXには“行の順番”がない

DAXは基本的に「表の集合に対して計算する」仕組みで、Excelのように「上から下へ順番に処理する」世界とは違います。つまり、テーブルに見えている並び順は、あくまで表示上の並びであって、DAXがそれを前提に“次の行”“前の行”を認識しているわけではありません。

そのため、DAXでインデックス列を作るときは必ず、
どの列を基準に順番を決めるのか
同じ値(同点)が出たらどうするのか
を明示する必要があります。

ここが曖昧なまま「なんとなく連番っぽいもの」を作ると、並びが変わったり、更新のたびに番号が入れ替わったり、想定外の重複が出たりします。

Power Queryで作るインデックス列と、DAXで作るインデックス列の違い

インデックス列は大きく2つの作り方があります。どちらが正しいというより、向き不向きがはっきりしています。

Power Queryで作るインデックス列が向くケース

・取り込み時に確定する連番が欲しい
・更新後もなるべく安定した番号が欲しい
・結合や参照で使う“固定のキー”が欲しい(ただし注意あり)
・大量データで、DAX計算を重くしたくない
・DirectQueryで無理にDAXを複雑化したくない

Power Queryのインデックスは、データの並び(ソート)を確定させてから付与すると、同じ入力に対しては比較的安定します。ただし、元データの並びや抽出条件が変われば当然変わります。インデックスはあくまで派生列なので、「将来も永久に同じ値であり続ける保証」を期待しないのが安全です。

DAXで作るインデックス列が向くケース

・特定の並び基準で順位や順番を付けたい
・グループごとに連番を付けたい(顧客ごと、案件ごとなど)
・同じデータでも、集計の切り口に応じて順序や比較を変えたい
・最新1件や上位N件を取りたいロジックを作りたい

DAXで作る“インデックスっぽい列”の正体は、多くの場合「順位(Rank)」です。順位は基準列が変わると変動するのが自然で、そこを理解して使うと非常に強力です。

DAXでインデックス列を作る基本パターン

ここからは、実務でよく使うDAXパターンを用途別に紹介します。どれも「基準列を明確にする」ことがポイントです。

パターン1:全体で連番っぽい順位を付ける(基準列が1つ)

例:日付が古い順に1,2,3…を付けたい

Index_All =
RANKX(
ALL('Fact'),
'Fact'[Date],
,
ASC,
Dense
)

考え方はシンプルで、Factテーブル全体(ALL)に対してDateで順位を付けています。Denseを使うと、同じ日付が複数あった場合に同じ順位になり、その次は飛び番になりません。

注意点として、同じDateが複数行あると順位が重複します。重複が困る(完全な一意連番が欲しい)場合は、次のパターンが必要です。

パターン2:同点回避して一意の順番を作る(2段ソート)

例:Dateが同じ行があるので、IDで同点を崩したい

Index_All_Unique =
VAR d = 'Fact'[Date] VAR id = 'Fact'[RecordID] RETURN
1 +
COUNTROWS(
FILTER(
ALL('Fact'),
'Fact'[Date] < d
|| ('Fact'[Date] = d && 'Fact'[RecordID] < id)
)
)

これは「自分より前に来る行が何行あるか」を数えて+1する方法です。Dateが同じ場合はRecordIDで順序を決めます。こうすると、Dateが同じでもRecordIDで一意に順番が決まるため、連番が安定します。

ただし、この書き方はデータ量が大きいと重くなりやすいです。100万行級で多用するより、必要なテーブルだけに絞る、あるいはPower Query側で整備する方が現実的なこともあります。

パターン3:グループ内のインデックス(顧客ごとの購入順など)

例:顧客ごとに購入日順の1,2,3…を付けたい

Index_ByCustomer =
VAR c = 'Fact'[CustomerID] RETURN
RANKX(
FILTER(ALL('Fact'), 'Fact'[CustomerID] = c),
'Fact'[OrderDate],
,
ASC,
Dense
)

これで「同じCustomerIDの中だけ」で順位が付きます。顧客別の購入回数やリピート分析などでよく使います。

注意点は、OrderDateが同じ場合に順位が重複することです。重複が困るなら、OrderDateに加えてOrderIDなどの同点回避キーを使う設計にします。

パターン4:グループ内で一意の順番(同点回避付き)

例:顧客内で購入日が同じ行も含めて一意にしたい

Index_ByCustomer_Unique =
VAR c = 'Fact'[CustomerID] VAR d = 'Fact'[OrderDate] VAR id = 'Fact'[OrderID] RETURN
1 +
COUNTROWS(
FILTER(
ALL('Fact'),
'Fact'[CustomerID] = c
&& (
'Fact'[OrderDate] < d
|| ('Fact'[OrderDate] = d && 'Fact'[OrderID] < id)
)
)
)

これで顧客ごとに完全な連番になります。イベントログや履歴テーブルで「順番が重複すると困る」場合に効きます。

インデックス列を使った実務テクニック

DAXでインデックス列を作れるようになると、次のような分析が作りやすくなります。

最新1件だけを抽出する(グループごと)

顧客ごとの最新購入、案件ごとの最終ステータス、設備ごとの最新点検など。

考え方は、グループ内の順位を降順で付けて、1だけ残す、です。

Rank_Latest_ByCustomer =
VAR c = 'Fact'[CustomerID] RETURN
RANKX(
FILTER(ALL('Fact'), 'Fact'[CustomerID] = c),
'Fact'[OrderDate],
,
DESC,
Dense
)

この列が1の行が最新です。同点があるなら同点回避キーを入れます。

前回との差分を作る(前回購入日、前回スコアなど)

「直前の行」を参照したい場合は、インデックスがあると考えやすくなります。たとえば、顧客ごとの購入順インデックスがあるなら、インデックスが1つ小さい行の値を探します。

ただし、DAXで“前の行”を取るのは簡単そうで難しく、テーブルが大きいと重くなりがちです。実務では次の方針が安全です。

・差分が頻繁に必要なら、可能ならデータソース側で前回値を持たせる
・Power Queryでグループ化や並べ替えをして前回値列を作る
・DAXでやるなら、対象を限定し、同点回避キーまで含めて一意にする

DAXで前回を取る典型は「自分のインデックス-1の行をフィルターして参照する」考え方ですが、実装はデータ量によって工夫が必要です。

並び順を固定する(カスタム順)

ステータスやカテゴリを任意の順に並べたいときに、インデックス列(順序列)を作って「列で並び替え」を使います。

例:ステータステーブルに
・Status(表示用)
・StatusOrder(順序)
を用意し、StatusをStatusOrderで並べ替えます。

この順序列はDAXで作るより、素直にマスタとして持つ方が安定しやすいです。DAXで無理に順序を作ると、条件が増えたときに壊れやすくなります。

よくある落とし穴と対策

power bi インデックス列 daxでつまずきやすいポイントを、原因と対策でまとめます。

落とし穴1:インデックスが毎回変わる

原因はだいたい次のどれかです。
・順番の基準列が曖昧(同点が多いのに同点回避がない)
・ALLやFILTERの範囲が意図と違う(想定より広い、狭い)
・キー列が安定していない(更新のたびにIDが変わるなど)

対策は、必ず並びの基準を決め、同点回避キーまで含めて一意にすることです。もし安定性が最重要なら、DAXではなくデータソース側でキーを付与する方が安全です。

落とし穴2:順位が重複して困る

RANKXのDenseは重複を許します。日付だけ、金額だけなどで順位付けすると、同点が発生するのは自然です。

重複が困る場合は、
・同点回避キーを追加して順位付けする
・COUNTROWS方式で一意連番を作る
のどちらかにします。

落とし穴3:インデックス列が重くて更新が遅い

DAXの計算列は、更新時に全行分を計算します。大きなテーブルで、ALLを使ったFILTERやCOUNTROWSを多用すると、更新が重くなります。

対策は次の順です。
・まずPower Queryで作れるならそっちに寄せる
・DAXで必要なら、テーブルを分ける(必要な粒度の表を作る)
・同点回避が必要な場合でも、IDや日時を工夫してRANKXで済む形にできないか考える
・どうしても重いなら、そもそも分析要件を見直し、集計済みテーブルで代替する

落とし穴4:DirectQueryでインデックス列をDAXで作ってしまう

DirectQueryは裏側でクエリに変換されるため、複雑なDAX計算列や順位計算が想定以上に重くなったり、そもそも制約で作りにくかったりします。

DirectQueryでインデックスが必要なら、基本はデータソース側(SQLなど)でROW_NUMBERのような形で作る方が安定します。どうしてもPower BI側でやるなら、用途を限定し、集計側で吸収できないかを検討するのが安全です。

落とし穴5:インデックスをリレーションのキーにしてしまう

インデックスは派生列で、データの追加・削除・並び基準の変化で値が変わり得ます。これをキーにすると、関係が壊れたり、昨日まで合っていた数字がズレたりします。

リレーションのキーが必要なら、業務的に意味のあるID、またはデータソース側で保証されたサロゲートキーを使う方が安全です。どうしてもPower BI内で作るなら、値が変わらない条件を明確にしてからにします。

インデックス列を作る前に決めておくと失敗しないこと

最後に、インデックス列づくりで迷ったときの判断軸をまとめます。

  1. 何のためのインデックスか
    並び替えか、グループ内の順番か、前回比較か、最新抽出か。目的で最適解が変わります。

  2. 何を基準に順序を決めるか
    日付なのか、更新時刻なのか、IDなのか、金額なのか。基準列を先に決めます。

  3. 同点が起きたらどうするか
    同点を許容するか、一意にするか。一意にしたいなら同点回避キーまで設計に含めます。

  4. どこで作るか
    安定性と性能を重視するならPower Queryやデータソース側。分析ロジックとして順位が欲しいならDAX。

  5. データが増えたときの負荷を許容できるか
    DAX計算列は更新時に全行計算です。将来200万行、500万行になったときも回るかを想像しておくと手戻りが減ります。

まとめ

power bi インデックス列 daxは、うまく使うと「履歴の順番」「最新抽出」「前回比較」「並び替え」などが一気に作りやすくなり、分析の幅が広がります。一方で、DAXは行の順番を前提にしないため、基準列と同点回避を決めないまま作ると、番号が変わる、重複する、重い、といった問題が起きやすいです。

安定した連番が欲しいならPower Query側で作る
グループ内の順番やランキングが欲しいならDAXで作る
同点があるなら同点回避キーを必ず用意する
インデックスをキーにしてリレーションを組むのは慎重にする

この4点を押さえておけば、インデックス列はトラブルの元ではなく、現場で使えるレポートを作るための強力な部品になります。

こんな課題がある場合はご相談を

  • 「既存のデータ構造が複雑すぎて、うまくモデル化できない」
  • 「DAX の高度な使い方がわからない」

こういったお悩みをお持ちの方も多いのではないでしょうか。
Power BI の導入・活用でお困りの際は、ぜひ無料相談をご利用ください。
もし困り事があるなら、まずは無料相談はこちら

コンサルサービスの詳細や成功事例なども合わせてご紹介いたします。
社内にデータ活用のノウハウや専門人材が十分いない場合でも、弊社が伴走しながら最短ルートで成果を出せるようサポートいたします。


セマンティックモデルを活かすためのスキルアップ

📊 Power BIでより効率的なレポート作成を!

DAX 関数をマスターして、実務で使えるスキルを身につけませんか?
Power BIハンズオンセミナー中級編では、短時間でデータモデリングのノウハウを学び、ビジネスに活かせるレポート作成を実践形式で習得できます。

📈 Power BIスキルを次のレベルへ!

DAX関数 × データモデル設計 で、複雑なデータ分析やレポート作成もスムーズに!
Power BIハンズオンセミナー中級編 なら、実践形式で学べるから即戦力に。
業務効率をアップし、社内での評価を高めるチャンス!

セマンティックモデルを最大限に活用するためには、DAX やデータモデル設計の知識が欠かせません。レポートの正確性やパフォーマンスを大幅に改善できるため、学んでおいて損はない分野です。

関連記事

この記事へのコメントはありません。

カテゴリー

アーカイブ