Posted at

Power Query エディターでテーブルにフィルターを適用するときは、その条件をみっちり確認したほうがよいですよ

テーブルの行に対してフィルタリングをするとき、Excel ワークシート上の操作では気にすることはほぼ皆無なのだけど Power Query エディターの同じような操作ではそうでなかったりするのですよ。


どういうことか

テーブルに対しこのあと必要な行だけを抽出したい。



"A" と "B" と "C" だけを仲間にしたいのでそれらを選ぶ操作をした。



よしよし。



ソーステーブルにあらたな行"F"が現れた。



"F" も仲間に加わった。


なぜなのか

"選択"と"除外"という認識がなされていて、効率が良い方をPower Query エディターが決定している


しきい値は 50%

選択されているアイテム数が半数以下の場合は選択


選択(AかB)

let

Source = #table(type table [Column1 = text],List.Transform({"A".."E"}, each {_})),
FilteredRows = Table.SelectRows(
Source,
each (
[Column1] = "A"
or [Column1] = "B"
)
)
in
FilteredRows

選択されているアイテム数が半数を超える場合は除外


除外(D,Eではない)

let

Source = #table(type table [Column1 = text],List.Transform({"A".."E"}, each {_})),
FilteredRows = Table.SelectRows(
Source,
each (
[Column1] <> "D"
and [Column1] <> "E"
)
)
in
FilteredRows


Table.SelectRows

Table.SelectRows( table as table, condition as function ) as table

条件関数を満たす行を選択します。

選択 condition と一致する行のテーブルを table から返します。

Returns a table of rows from the table, that matches the selection condition.


条件関数 condition が変わるのです。


思ったこと🙄

Excel ワークシートのノリで作業をしたらだめですよ、という話。Power Query はあらかじめ全容を確認できるデータだけを扱うものではないので、得たい結果がどうあるべきなのかきちんと考えながらかな。

ほかにも Power Query エディターには 200 とか 1000 とかしきい値があるのでよーく観察して。


その他


おまけ

選択したいアイテム数が多くて Table.SelectRows の condition がとても長くなる時どうしたらよいのか。

List.Contains とか使うとよい。


List.Containsでおまとめ

let

Source = #table(type table [Column1 = text],List.Transform({"A".."E"}, each {_})),
FilteredRows = Table.SelectRows(
Source,
each List.Contains({"A", "B", "C"}, [Column1])
// each (
// [Column1] = "A"
// or [Column1] = "B"
// or [Column1] = "C"
// )
)
in
FilteredRows