なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

Power Query:マージ列の展開時に行の順番がずれないようにする

クエリのマージを実行した後で、結合した列を展開(Table.ExpandTableColumn)した時に、行の順番がずれてしまったことはないだろうか。

例えば下のようにテーブル1とテーブル2をマージして「テーブル2」列から必要な列を展開すると、

「名前」列が元の順番と変わってしまう場合がある。

仕様に文句をいっても仕方がないので、これが起きないようにするにはどうすればいいか考えてみた。

まず一つ目の方法。そもそも「クエリのマージ」を使わずにアイテムアクセスで必要情報を呼び出してやったらどうか。

方法1:アイテムアクセスを使う

[列の追加]→[カスタム列] = try テーブル2{[名前=[名前]]}[ID] otherwise null →[OK]

当たり前だが、カスタム列の追加なのでこの場合は行の順番が崩れない。

ただしこのやり方はパフォーマンスがかなり落ちる。ついでにいうと複数列展開したい時に不便である。

という訳で次の方法。必要行を抽出する関数をカスタム列に入れ込んでやったらどうか。

方法2:関数を使って抽出する
[列の追加]→[カスタム列] = (x)=> Table.SelectRows(テーブル2, each [名前]=x[名前]) →[OK] 表示された式の「each (x)=>」を「(x)=>」に修正する。

やはりこれでも順番はずれない。

この方法、関数を工夫すれば複数列の展開にも対応させられる。ただし、Table.SelectRowsを使うのでデータ量が多くなるとこれまたメモリの消費が激しい。

という訳で3つ目の方法。そもそも展開した時に行がずれるのは、マージした時のいらない処理が再評価されているからなんだから、一度 Bufferをかましてやればいいんじゃなかろうか。

方法3:展開前に Table.Bufferをかませる

    緩衝テーブル = Table.Buffer(ソース)

この後に列を展開。実験結果は下記の通り。

ほらやっぱりずれない。

これ多分、事前に「インデックス列を追加する」でも防げるかも?