見出し画像

Power BI - クエリ画面でグループごとの最大値を出力する方法 Table.Max

その日一番売上を上げた営業マンを特定したり、
その日の最終的な預金残高を銀行明細から特定したり、

特定の列に記録された同一グループの中から、
最大値(もしくは最小値)を抜き出す
にはどうすればよいでしょうか。

DAX関数を使用するのであれば、
CALCULATEやMAXなどを使用すれば、
なんとなくできそうなイメージを持てると思うのですが、

M言語(クエリエディター上)で、
特定の列に記録された同一グループの中から、
最大値(もしくは最小値)を抜き出すとなると、
ちょっと難しいイメージがあると思います。

そんな時は、M言語(M関数)の、テーブル関数である、
Table.Max関数を使用します!


使用するサンプルテーブルと結果イメージ

今回の例は、次のような銀行明細データを前提とします。

オンラインバンキングからDLしたデータで、
各レコードは、取引単位で生成されています。

画像1

このテーブルから、
各日付ごとに一日の終わりの残高(Balance)を求めることを目的とします

具体的には、
以下の赤枠のレコードだけ抽出されたテーブルを作りたいということです。

画像2

画像3


まずはグルーピングする

サンプルデータでは、
「同じ日付」に「複数のBalance」が存在するため、
クエリには、
「同じ日付」で一旦グルーピングしてから、各グループにおける最大値を出力させる必要があります。

まずはデータを取り込んだら、
「データの変換」からクエリエディタに移動しましょう

クエリエディタに移動したら、
次は、グルーピングしたい列(Date列)を選択し、
「変換」タブ>「グループ化」をクリック
します。

画像4

「グループ化」の編集ウィンドウが立ち上がるので、
「詳細設定」を選択し、
「新しい列名」を適当な名前(ここでは”Temp”にします)を付けます。
そして、「操作」を「全ての行」にして、「OK」をクリック
しましょう。

画像5

すると、グルーピングされた「Date」列と、それ以外は全て「Temp」列にTableとしてまとめられた状態で、テーブルがシンプルになります。

画像6


次に、カスタム列を追加してTable.Max関数を使用する

サンプルテーブルは、「Transaction_id」順に取引が並んでいるので、
各日付の「Transaction_id」が最大値である行に、
その日の終わりの「Balance」が記載されているという特徴があります。

従って、「Temp」列に圧縮されて格納されている各日付内における取引記録のかたまりから、「Transaction_id」が最大であるときの「Balance」を抜き出すことが目的となります。

これを実行するのが、M関数のテーブル関数である、Table.Max関数になります。

具体的な手順は次の通りです。
まず「列の追加」タブ>「カスタム列の追加」を選択し、

画像7

次のように、M関数を入力します。

画像8

Table.Max関数は、
第1引数に対象のテーブル(←抽出したい目的の値と、目的の値をソートするための値が入っているテーブル)を指定し、
第2引数に、最大値を判定させたい
第1引数で指定したテーブル内の列名を文字列で指定します。

OKを押すと、このようになります。

画像9

この状態になれば、目的は90%達成しています。

なぜなら、新しく追加されたカスタム列(ここでは「Balance_EOD」列)の各「Record」には、先ほどTable.Max関数で識別した、各日付における「Transaction_id」が最大の行だけが格納されているからです。
(”Table”(複数行)ではなく、”Record”(1行)になっているのです)

では「Record」を開いて、目的の「Balance」を表示させましょう。

ここをクリックします。

画像10

そしたら、出力させたい「Balance」だけチェックを残して、OKを押します。

画像11

でました

画像12

最後に、不要な「Temp」列を消したら、
目的の「Transaction_id」が最大であるときの「Balance」
すなわち、各日付におけるその日の終わりの「Balance」だけが残されたテーブルが完成します!

画像13

以上となります。

この記事が気に入ったらサポートをしてみませんか?