Power Appsで一意なデータを取り出す方法

例えばこんなデータがあったとしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/d8fddae0-5d76-872a-9ada-619002c9e3c0.png)

ここから、モデル名だけのリストを作りたい場合、または容量の違いを見ずに、モデル名とカラーだけのリストを作りたい場合、どうしたらよいでしょうか？
そんな、"簡単にできそうだけどちょっと苦戦しそう"な課題の解決方法をご紹介します。

# 重複の排除
単純に、重複を排除するのであれば、Power Appsでは[Distinct関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-distinct)というものが提供されています。
これは、指定したコレクション/テーブルに対して、指定した列に関する重複を排除し、結果のリストを返す関数です。
結果は、Splitなどの時と同様、*Result*という名前の列で返ってきます。
上の例でいえば、例えば*Name*列に関して重複を排除したい場合(結果はiPhone XRとiPhone 11だけになることが想像できる量ですが)、対象となるコレクションを*prodList*という名前とすると、以下のように書けます。

```
Distinct(prodList, Name)
```
※列名は""で囲ったりしない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/c97bd8aa-94ec-0615-f420-98d846e39e59.png)

これだけで、モデル名に関しての一意なリスト(重複を排除した結果)が得られました！

と、これだけだと使い道も思いつかない。特に今回の場合には、1つのレコードがName-Color-Capacityで一意になっていますよね。
ここからNameとColorを含む、重複のない一覧を作るにはどうしたらよいでしょうか。

# AddColumns + Ungroupで解決
戦略としては、まずNameで一意なリストを作っておいて、そこにAddColumnsしてあげればよいです。例えばNameとColorなら以下のような進め方で。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/fc371fe8-a530-a128-82d4-770fb4d6c6cd.png)

結果だけ書くと

```
RenameColumns(
    Ungroup(
        AddColumns(
            RenameColumns(
                Distinct(
                    prodList,
                    Name
                ),
                "Result",
                "ProdName"
            ),
            "col",
            Distinct(
                Filter(
                    prodList,
                    Name = ProdName
                ),
                Color
            )
        ),
        "col"
    ),
    "Result",
    "Color"
)
```
こんな数式です。AddColumnsしてUngroupするのは、以前の[データ結合の投稿](https://qiita.com/h-nagao/items/769136d2f227667ca0f8#left-outer)で詳しく解説していますので、よろしければ見てみてください。
結果は、目的通り、モデル名とカラーだけで一意なリストが出来上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/57d0d83f-2226-d68f-69c1-b54fe726e883.png)

# 解説
一気に書いちゃったので、部分ごとに解説します。

```
        AddColumns(
            RenameColumns(
                /*ここは名前でDistinctしたところ*/
                Distinct(
                    prodList,
                    Name
                ),
                /*AddColumnsの時のために名前を変えておく*/
                "Result",
                "ProdName"
            ),
            "col",
            Distinct(
                Filter(
                    prodList,
                    Name = ProdName
                ),
                Color
            )
        )
```
ここでは、まず元のDistinct(...)でRenameColumnsしています。これは便宜的にです。
そのあとのAddColumnsですが、追加する列は上で図示したように、もとのリストを、Distinctした結果の各行(モデル名)でフィルターして、さらにカラーでDistinctしています。中間の結果として、以下のようなデータが作られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/2b4c8907-d6fe-08ad-25c1-aed51725a6a9.png)


残りのパートですが、UngroupしてRenameColumnsしています。

```
RenameColumns(
    Ungroup([上の結果],"col"),
    "Result",
    "Color"
)
```
Ungroupは入れ子になっているテーブルをほどくための操作です。ここでは*col*という列で展開することで入れ子がほどけて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/432b6e77-eec7-4db7-fbb0-633a7b4821f4.png)
こんなデータになります。
最後はResultをもとの名前、Colorに戻しているだけです。

ということで、
Distinctして、AddColumns、その際追加するのはFilterしたリストのDistictしたもの。Ungroupで入れ子解除。
という手順で2つの列で一意なリストを作成することができました。

# おわり
Power Appsのデータ操作は中間の結果見ながら進めるのがよいです。
なれるまでは一個一個分解して、コレクションに格納して、データテーブルで中身を確認しながら進めてみましょう。
とにかく、一意なデータ = Distinctを利用 ということだけ覚えていただけたら、次につながりやすいと思います！

ご質問はTwitterまで！