このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-072: レシート明細データ(receipt.csv)の売上日(sales_ymd)に対し、顧客データ(customer.csv)の会員申込日(application_date)からの経過年数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに10件表示せよ(sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。1年未満は切り捨てること。
※経過日数をelapsed_yearsというフィールド名とすること
※結果は、customer_idの昇順、elapsed_yearsの昇順で出力すること
※sales_ymd、application_dateは日付型で出力すること
※レシート明細データ上、重複する日付のデータは削除すること
解答ワークフローは以下のようになります。
70問目とほぼ同様の問題で、違いはフォーミュラツールの設定のみです。
時短のために70,71問目との違いのみ解説
70,71問目との違いは、日数の差分を出すために使っていたフォーミュラツールの設定を変えて年数で出すようにするだけです。もちろん、フィールド名は「elapsed_days」もしくは「elapsed_months」であったものから「elapsed_years」に変更する必要があります。
DateTimeDiff([sales_ymd_Date],[application_date_Date],"years")
フォーミュラツールで利用している計算式のDateTimeDiff関数の三番目の引数は70問目では「days」でしたが、この問題では年数を求めるため「years」となります。
フル解説
今回も複合的な問題となりますが地道にワークフローを構築しましょう。
ポイントは、以下の点になるかと思います。
- 数値型はそのまま日付型にできないため、一度文字列型にしてから日付型に変更する必要があります
- 日付の差分を取るときは、DateTimeDiff関数を使います
- receipt.csv側のデータは、同じcustomer_idに対して同じ売上日(sales_ymd)のレコードが複数あるため、重複するデータは捨てる必要があります
まず、receipt.csvから加工していきましょう。
最初にセレクトツールで数値型となっているsales_ymdを文字列型に戻す必要があります(厳密には、String型で十分ですが、その他の文字列型でも問題ありません)。ついでに不要な項目も削除します。
次に、ユニークツールでcustomer_idとsales_ymdのユニークレコードを取得します。この時点ではcustomer_idとsales_ymdしか項目がないため、両方にチェックを入れます。
さらに、日時ツールで、sales_ymdを文字列型から日時型に変換します。ここでのフォーマットはプリセットの「yyyyMMdd」が使えます。
このデータを①としておきましょう。
次に、customer.csvを加工していきます。
こちらは、日付型に変換していきたいフィールドである「application_date」は文字列型で提供されているため、いきなり日時ツールで日付型に変換していくことができます。こちらもプリセットの「yyyyMMdd」がそのまま利用できます。
さらにセレクトツールで不要な項目を削除しておきましょう。
このデータを②とします。
次に、この2つのデータ①②を結合していきます。以下のように接続します。
キーフィールドは「customer_id」です。もちろん不要なフィールドは削除します。
次に、J出力にフォーミュラツールを接続し、会員申込日からの経過日数を計算していきます。この場合、DateTimeDiff関数を使います。
DateTimeDiff関数
2つの日時型の間の差を指定した単位で計算します。最初の引数から2番目の引数を引き算します。つまり、dt1-dt2となります。
DateTimeDiff(dt1,dt2,u)
引数 | データ型 | 詳細 |
---|---|---|
dt1(date 1) | 日時型/日付型 | 日時/日付型の値もしくはフィールド |
dt2(date 2) | 日時型/日付型 | 日時/日付型の値もしくはフィールド |
u(unit) | 文字列型 | 単位。years、months、days、hours、minutes、secondsを指定 |
実際の設定は以下のようになります。日付の差分が知りたいので、大きい日をdt1、小さい日をdt2とします。つまり、購入日は登録日よりも後なので、dt1は購入日のsales_ymd_Date、dt2は登録日のapplication_date_Dateとします。
DateTimeDiff([sales_ymd_Date],[application_date_Date],"years")
フィールド名は「elapsed_years」とし、型は数値型(Int16)とします。
最後に、フィールド名を整えたいと思います。セレクトツールで整えても良いですが、今回は動的リネームツールを使ってみましょう。このツールは、接尾辞(フィールド名の最後の部分)から特定のワードを消すような処理が可能です。今回であれば元々のフィールド名に「_Date」とつけていたので、接尾辞の「_Date」を消すことで元の名前が得られます。
実際の設定としては以下のような感じです。
名前の変更モードは、「接頭辞/接尾辞の削除」とし、処理を行いたいフィールドにチェック。プロパティとして、削除するに「_Date」を記載し、接尾辞を選択します。
動的リネームツールは、名前の変更モードによってオプションや動きが全然異なるので気をつけましょう。
あとは、ソートツールでcustomer_idの昇順、elapsed_yearsの昇順に並び替え、サンプリングツールなどを使って先頭から10件を取得すれば完了です。
まとめ
今回は70,71問目とほぼ同様の問題でした。70問目は2つの日付の差で日数を計算、71問目は2つの日付の差で月数を計算する問題でしたが、この問題は年数を計算する問題でした。違いはわずかですので、DateTimeDiff関数に与えれるパラメータの違いを認識いただければと思います。
コメント