Free Trial

ディスカッション

答えを見つけ、質問し、Alteryx の専門知識を共有してください。
解決済み

複数行フォーミュラをインデータベースで実現する方法について

daisuke_daisuke
アトム

複数行フォーミュラのIF文で(行-1)と(行+0)のデータが一致したら特定の値を返す、といったフローを組んでいるのですが、

データ量が多い場合に相当の処理時間がかかってしまうため、インデータベース上で同じことを処理してしまえないかと思っています。

データベースはSnowflakeを使っているのですが、フォーミュラIN-DBツールで実現することは可能でしょうか。

可能な場合は構文例などいただけますと嬉しいです。

2件の返信2
AkimasaKajitani
17 - Castor
17 - Castor

@daisuke_daisuke さん

 

複数行フォーミュラを使って何をしたいか、ということに依存しますが、例えばDesigner Cloudは複数行フォーミュラがないため、似たような手法が使えるかと思います。以下ブログの1の方法などは応用可能です。レコード番号をつけて、レコード番号に対してプラスマイナス1とかしてから結合することで、別の行のデータを引っ張ってくることができます。

https://newssdx.kcme.jp/designer-cloud_multirowformula_alternative/

 

ただ、レコード番号はフォーミュラIN-DBかDBから引っ張ってくるときにSQLの関数で実現する必要があります。

 

例えば、以下のようなSQLが必要になります。

select row_number() OVER (ORDER BY "Date") AS row_number from TEST_AK.PUBLIC.DATE_TABLE;

https://docs.snowflake.com/ja/sql-reference/functions/row_number

 

これもフォーミュラInDBで対応可能です。

 

スクリーンショット 2024-03-29 165103.png

 

スクリーンショット 2024-03-29 165129.png

最終的には、以下のようなWFになります。

 

スクリーンショット 2024-03-29 165142.png

これによって、以下のような出力が得られます。 

 

スクリーンショット 2024-03-29 165209.png

 

ちなみに、インプットは以下のような感じです。

スクリーンショット 2024-03-29 165223.png

 

あとは、フォーミュラInDBである程度SnowflakeのSQL関数が使えるので、例えばRank関数などある程度の範囲で見るようなSQLは機能しますので、やりたいことに応じてSQL関数を検討してみてください。

よくよく見ると、上記のようなことも、LAG関数を使えばもっと簡単に実現可能かと思います。

https://docs.snowflake.com/ja/sql-reference/functions/lag

 

LAG("Date", 1, NULL) OVER (ORDER BY "Date" DESC)

 

整理せずにばらばら書いてしまいましたが、結論としてはLAG関数で前後のデータを持ってきつつ計算するのが一番楽に思います。

daisuke_daisuke
アトム

AkimasaKajitani
早速ご指南くださりありがとうございます!

なるほど、LAG関数で参照すればよいのですね。分かりやすいご説明に大変感謝いたします。