Quantcast
Channel: なんでもエクセル(Nandemo Excel)
Viewing all articles
Browse latest Browse all 52

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

$
0
0

クエリのマージを実行した後で、結合した列を展開(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(ソース)

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

やっぱりずれませんでした。

そうすると、事前に「インデックス列を追加する」でもいいのかもしれません。


Viewing all articles
Browse latest Browse all 52

Trending Articles