0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

レコード間で同じフィールド同士の計算をする |Power Query

Posted at

今日たまたま書いたので、残しておきます。

Power Queryのレコード(record)とは

名前でアクセスできる配列です。個人的には多用しています。
Power Queryにおいては、下図のようにして定義できます。
image.png

フィールド値の取り方

//簡単な記法。
= [a=10,b=2,c=5][b]          //=2
//関数に入れれば、テキストで指定できる。
= Record.Field( [a=10,b=2,c=5],"a") //=10

なお、一致判定上、順序が考慮されません。
image.png

やりたいこと

フィールド間の計算を直接やってくれる関数はありませんので、自分で書くしかないわけです。
今回は、2つのレコードの差を取ってみます。

コード

色々やり方はあると思いますが、素直にフィールド名で値を取っていきます。
ちなみに、フィールドに適用する関数をfxとして抜き出してありますので、ここをいじったり、引数に組み込んでやれば、引き算以外もできます。

fx_レコード差分
(x as record,y as record) as record=>
let
    FieldNames = Record.FieldNames(x),
    fx = (a,b)=> a-b,
  //FieldNamesの値を1個ずつ使って計算。アンダーバーの箇所に中身が入ります。
    calculation =List.Transform(
                    FieldNames,
                    each fx(Record.Field(x,_),Record.Field(y,_))
    ),
    Result =Record.FromList(calculation,FieldNames)
in
    Result

適用例

出来上がりのフィールド順序は、1個目の引数に入れたレコードの順番に合わせています。値自体はどちらのレコードも同じなので、差は0になっていますね。
image.png

実用的には、レコード列をそのまま計算するのに使えます。この例ではdata列はその日の値、data0は前日の値を格納してあり、その差分の計算結果をレコードとして列追加しています。
ここまでくれば、あとはレコード展開などもできます。
※データは架空のものです。
image.png

展開後(GUIで可能)
image.png

レファレンスなど

レコード関数 - PowerQuery M | Microsoft Docs

Power Query M 言語仕様 値 レコード

List.Transform - PowerQuery M | Microsoft Docs

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?