このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-025: レシート明細データ(receipt.csv)に対し、顧客ID(customer_id)ごとに最も古い売上年月日(sales_ymd)を求め、10件表示せよ。
※出力結果は、顧客ID(customer_id)の昇順で並び替えて出力してください(Alteryxオリジナル条件)
※出力結果の項目は、顧客ID(customer_id)、売上年月日(sales_ymd)のみとする
解答ワークフローは以下のようになります。
24問目を解いていれば、若干のワークフロー変更で解ける問題です。以下ほぼ同じ文章になりますので、24問目と異なるところのみ青色にしてみます。
今回は、取得したい値である売上年月日(sales_ymd)が数値型であり、さらに取得項目としてグループ化するフィールドである顧客ID(customer_id)のみを抽出ということですので、集計ツールで簡単に対応することが可能です。
また、このようなケースでは、一番古い日付のレコードを残す、といったことが必要とされることがあります。このような場合は集計ツールを使わず、並び替えた上でサンプリングをする汎用的な方法があるので紹介していきたいと思います。
- 集計ツール使用
- ソート&サンプリング
いずれの方法も、最初は型を変更する必要があります。今回、売上年月日(sales_ymd)はInt32型となります(オートフィールドツールで最適な型を判別してみてください)。セレクトツールでまず型を変更する必要があります。また、顧客ID(customer_id)、売上年月日(sales_ymd)の2フィールドのみが必要となるので、不要な項目は最初に消してしまいましょう。
この後は、それぞれの手法ごとに解説します。
集計ツール使用
今回、顧客ID(customer_id)ごとに一番古い最新の日付を取得したいということなので、customer_idでグループ化し、saled_ymdの最小値を取ればよいです。これは、集計ツールで以下のように簡単に行うことができます。
あとは、出力条件に従って、customer_idの昇順でソートし、10件を抽出すればできあがりです。ワークフローとしては以下のようになります。
ソート&サンプリング
次に、汎用的に使える方法をご紹介します。
今回は、顧客ID(customer_id)ごとに一番古い日付を取得するといった単純な問題でしたが、最新の日付のレコード全体を残したい、ということになると、その他のフィールドをどう扱うか、という問題が出てきます。最大値なのか、最小値なのか・・・それとも?
もちろん集計ツールで各フィールドをどう取り扱うかを定義してしまえばよいですが、フィールドが不定である場合はそれも難しくなります。
なるべく各フィールドを触らずにレコード全体を残したい、といった場合はこちらの方法が有効です。
型変換後、まずは並べ替えます。この時、グループ化したいフィールドであるcustomer_idごとに並べ替え、さらに一番古い日付ということで、sales_ymdの昇順に並び替えます。
ここから、customer_idごとに最初の1レコードを取れば、一番古い日付が得られます。つまり、以下のような設定となります。
実際のワークフローは以下の通りです。
まとめ
今回は、集計の問題ともとらえられますし、一方で条件にあったレコードを取得するという問題でもありました。特にソート&サンプリングの方法は様々な場面で利用できるため、慣れておくと便利です。
コメント