Table.Distinct(List.Distinct)の使用例


第二引数の書き方にちょっと苦労したので、まとめておきます。

はじめに

マウス操作での「重複の削除」は使ったことがあると思います。
列のタイトルバーで右クリックすると、下図のようなメニューが出て、重複の削除ができます。

やりたいこと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通りの用法があります。
1. 列名の文字列のリストを入れれば、列の組合せを見てくれる。(Table.Distinctの方だけ。やりたいこと1参照)
2. {加工内容,比較方法}という形で入れてやれば、加工後の値での比較になる。

加工内容は関数で書きます。

  • List.Distinct ⇒各要素がそのまま関数に渡されるので、それが引数になるつもりで書く。
  • Table.Distinct ⇒各行の値がRecordとして関数に渡されるので、Record型の引数を処理できるように書きます。

比較方法は上記のコードでは「Comparer.Ordinal」だけ使いました。Comparer関数は他にもあるので、興味があれば使い分けたらいいんじゃないでしょうか。
Comparer functions| Microsoft Docs

ちなみに、比較方法にカスタム関数が入るのでは?と思ったのですが、エラーになりました。カスタムできるのは、加工内容の方だけのようです。

レファレンス

Power Query M Reference | Microsoft Docs
List.Distinct関数
Table.Distinct関数