第二引数の書き方にちょっと苦労したので、まとめておきます。
###はじめに
マウス操作での「重複の削除」は使ったことがあると思います。
列のタイトルバーで右クリックすると、下図のようなメニューが出て、重複の削除ができます。
###やりたいこと1:複数列をまとめて比較
これはまだ、マウスでできます。複数列選択した状態で実行すれば、選択中の列をまとめて比較してくれます。
できあがるコードはこんな感じです。
Table.Distinct(Source, {"Column2", "Column3"})
###やりたいこと2:値を加工してから比較
列追加とかしないで、ということです。これはもうコードを書くしかない。
####テーブル
例えば、こんなコードが通ります。(サンプルデータを含む)
並び替えて比較させています。
let
Source = Table.FromColumns({{1..3}&{1..3},{2,3,1}&{3,1,2},{3,1,2}&{2,1,3}}),
Custom1 = Table.Distinct(Source,
{each List.Sort(Record.ToList(_)), Comparer.Ordinal}
)
in
Custom1
↓実行前
↓実行後。行内容の組合せが重複しないようになりました。
####リスト
こちらも同じように書けます。
let
Source = {[a={1..3},b={2,3,1}],[a={1..3},b={3,1,2}]},
Custom2 = List.Distinct(Source,
{each List.Sort([b]), Comparer.Ordinal}
)
in
Custom2 //[a={1..3},b={2,3,1}]が返ります。
###若干の解説
公式レファレンスにある関数の構文では、
List.Distinct(list as list, optional equationCriteria as any, criteria as any) as list
Table.Distinct(table as table, optional equationCriteria as any) as table
となっています。この「equationCriteria」引数の書き方が問題です。
試した限りでは、下記2通りの用法があります。
- 列名の文字列のリストを入れれば、列の組合せを見てくれる。(Table.Distinctの方だけ。やりたいこと1参照)
- {加工内容,比較方法}という形で入れてやれば、加工後の値での比較になる。
加工内容は関数で書きます。
- List.Distinct ⇒各要素がそのまま関数に渡されるので、それが引数になるつもりで書く。
- Table.Distinct ⇒各行の値がRecordとして関数に渡されるので、Record型の引数を処理できるように書きます。
比較方法は上記のコードでは「Comparer.Ordinal」だけ使いました。Comparer関数は他にもあるので、興味があれば使い分けたらいいんじゃないでしょうか。
Comparer functions| Microsoft Docs
ちなみに、比較方法にカスタム関数が入るのでは?と思ったのですが、エラーになりました。カスタムできるのは、加工内容の方だけのようです。
###レファレンス
Power Query M Reference | Microsoft Docs
List.Distinct関数
Table.Distinct関数