質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

1192閲覧

データサイエンティスト100本ノックのパーセンタイルに関する問いにおけるクロスジョインについて

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/09/21 00:09

編集2020/09/21 00:46

データサイエンティスト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

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

教材の質問内容とSQLから

カテゴリ値は上から順に1〜4とする。

まずここから顧客毎ではなく「顧客関係なくカテゴリを生成」(正確にはカテゴリの範囲の生成)
する必要があります(sales_pct)。
その為カテゴリにJOINに対応するキーが無くなります。
またsales_pctは1レコードです。

よって結合する際、単純にJOINできないので
(sales_amountのcustomer_idに対応する値をsales_pctが持ってない)
CROSS JOINで総パターンを作成してレコードを並べ替え
その中の上位10レコードを抽出。

という考えが読み解けます。

サブのSQLで値を取得する方法もあるでしょうが、この教材の「くせ」なんでしょう。
どの方法がよいかはDBの種類によって変わってきます。
DBには「SQLの分析」を行う事が大抵できますので自分はその結果で調整しています。

投稿2020/09/23 21:20

kuma_kuma_

総合スコア2506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/25 08:17

理解できました! どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問