データサイエンティスト100本ノックという教材についての質問です。
S-055: レシート明細テーブル(receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、その合計金額の四分位点を求めよ。その上で、顧客ごとの売上金額合計に対して以下の基準でカテゴリ値を作成し、顧客ID、売上金額合計とともに表示せよ。カテゴリ値は上から順に1〜4とする。結果は10件表示させれば良い。
最小値以上第一四分位未満
第一四分位以上第二四分位未満
第二四分位以上第三四分位未満
第三四分位以上
という問について、以下のSQLで一番最後のSELECT分において、なぜクロスジョインしているのか理解ができません。
sales_amountとsales_pctでそれぞれ、顧客ごとの合計金額と、その合計金額に対する各パーセンタイルを求めていますよね。それに対してクロスジョインすると、左表と右表で直積を取ることで、左のcustomerとその合計金額に対して右は左と同じcustomerの各パーセンタイルだけでなく、他のcustomerのパーセンタイルとも掛け合わせて表示してしまっている気がするのですが、それで正しいのでしょうか(そもそも、問題分の読み方が間違っているのでしょうか)。
左表と右表で同じcustomer_idについてジョインするのであれば、単純にJOINで良いのでは?と思ってしまいました。
※追記:S-060でも同様の疑問が湧いたので、本教材全体通して何らかの流儀的なものがあるのかもしれません
%%sql WITH sales_amount AS( SELECT customer_id, SUM(amount) as sum_amount FROM receipt GROUP BY customer_id ), sales_pct AS ( SELECT PERCENTILE_CONT(0.25) WITHIN GROUP(ORDER BY sum_amount) AS pct25, PERCENTILE_CONT(0.50) WITHIN GROUP(ORDER BY sum_amount) AS pct50, PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY sum_amount) AS pct75 FROM sales_amount ) SELECT a.customer_id, a.sum_amount, CASE WHEN a.sum_amount < pct25 THEN 1 WHEN pct25 <= a.sum_amount and a.sum_amount < pct50 THEN 2 WHEN pct50 <= a.sum_amount and a.sum_amount < pct75 THEN 3 WHEN pct75 <= a.sum_amount THEN 4 END as pct_flg FROM sales_amount a CROSS JOIN sales_pct p LIMIT 10
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/25 08:17