データサイエンス100本ノック(構造化データ加工編)- SQL Part 3 (Q41 to Q60)

データサイエンス
解説:

このコードはSQL言語で書かれており、「WITH」句を使用して「sales_amount_by_date」と「sales_amount_by_date_with_lag」という2つの一時テーブルを作成しています。そして、「sales_amount_by_date_with_lag」テーブルから特定の列を選択し、「LAG」関数を使用して連続する日付間の売上金額の差を計算しています。

具体的には、このコードは次のような処理を実行している。

最初の「WITH」句は、「sales_amount_by_date」という一時テーブルを作成し、「recipate」テーブルの各日付の売上金額の合計を計算する。

2番目の「WITH」句は、「sales_amount_by_date_with_lag」という別の一時テーブルを作成し、「LAG」関数を使用して前日の売上金額と連続する日付間の売上金額の差分を計算する。

最後の「SELECT」文では、「sales_amount_by_date_with_lag」テーブルから、売上日、売上金額、前日、前売上金額、連続する日付の売上金額の差などの列を選択する。

そして、結果は売上日の昇順でソートされ、最初の10行に限定されます。

要約すると、このコードは「LAG」関数を使用して「レシート」テーブルの連続する日付間の売上金額の差を計算し、最初の10行の結果を表示します。
 
解説:

このコードもSQL言語で書かれており、「WITH」句を使用して「sales_amount_by_date」と「sales_amount_lag_date」という2つの一時テーブルを作成しています。そして、「sales_amount_lag_date」テーブルに対して自己結合を行い、特定の条件に基づいて結果にフィルタをかけています。

具体的には、このコードは以下の処理を実行しています。

最初の「WITH」句は、「sales_amount_by_date」という一時テーブルを作成し、「recipate」テーブルの各日付における売上金額の合計を計算する。

2番目の「WITH」句は、「sales_amount_lag_date」という別の一時テーブルを作成し、「LAG」関数を使用して、「sales_amount_by_date」テーブルの3日前の売上日および各日の売上金額を計算する。

最後の「SELECT」文は、「sales_amount_lag_date」テーブルから特定の列を選択し、自身との自己結合を実行する。結合条件は、ある行の売上日が他の行の売上日よりも小さく、2行目の売上日が3日前の1行目の売上日以下である行のみを含むように結果をフィルタリングします。

そして、結果は、販売日と前販売日の昇順でソートされ、最初の10行に限定されます。

要約すると、このコードは、「receipt」テーブルの各日付の売上日と売上金額を含むテーブルに対して、自己結合を実行しています。結合条件は、ある行の売上日が他の行の売上日よりも小さく、かつ2行目の売上日が3日前の1行目の売上日以下である行のみを含むように結果をフィルタリングします。結果は、最初の10行の販売日、販売金額、前販売日、前販売金額が表示されます。
 
解説:

このコードもSQL言語で書かれており、「WITH」句を使用して「sales_amount_by_date」という名前の一時テーブルを作成しています。次に、「LAG」関数を使用して、「sales_amount_with_lag」という名前の別の一時テーブルに追加の列を作成しています。最後に、「sales_amount_with_lag」テーブルから特定のカラムを選択し、特定の条件に基づいて結果をフィルタリングしています。

具体的には、このコードでは以下の処理を実行しています。

最初の「WITH」句は、「sales_amount_by_date」という一時テーブルを作成し、「recipate」テーブルの各日付における売上金額の合計を計算する。

2番目の "WITH "句は、"sales_amount_with_lag "という別の一時テーブルを作成し、"sales_amount_by_date "テーブルの各日の売上日および前3日間の売上金額を計算するために、"LAG "関数を使用しています。

最後の「SELECT」文は、「sales_amount_with_lag」テーブルから特定の列を選択し、3つ前の日付がNULLでない行のみを含むように結果をフィルタリングする。つまり、テーブルの最初の2行は、3番目の前の日付を持っていないので除外されます。

次に、結果を販売日の昇順で並べ替え、最初の10行に限定します。

要約すると、このコードは「レシート」テーブルの各日付の売上金額の合計を計算し、「LAG」関数を使用して各日付の前3日間の売上日と売上金額を計算している。結果は、各日付の売上日と売上金額、前3日間の売上日と売上金額を表示します。結果は、最初の2行が3つ目の前の日付を持っていないため、除外するようにフィルタリングされます。結果の最初の10行は、売上日の昇順で表示されます。
 
解説:

このSQLコードでは、年齢層(時代)と性別ごとに売上金額の合計をまとめたsales_summaryという名前のテーブルを作成します。

まず、顧客テーブルと領収書テーブルの結合を使用して、gender_era_amount という名前の共通テーブル式(CTE)が作成されます。このCTEは、年齢グループ(時代)と性別に基づいてレコードをグループ化し、総売上金額を計算する。

次に、gender_era_amount CTE のデータを集計して sales_summary テーブルが作成されます。このテーブルには、時代、男性、女性、不明という4つのカラムがあります。SELECT句内のSUM(CASE...)文は、性別ごとの売上金額を別々の列にピボットするために使用されます。

最後に、SELECT ステートメントを使用して、新しく作成された sales_summary テーブルからすべての行を取得します。
 
 
解説:

このコードはSQLで書かれており、customerというテーブルからデータを取得する。このコードの目的は、customerテーブルからcustomer_idとbirth_dayカラムを取得し、birth_dayカラムを特定の方法でフォーマットすることである。

SELECT文を使用してcustomerテーブルからデータを取得し、LIMIT句を使用して返される行の数を10行に制限しています。

TO_CHAR関数は、birth_dayカラムを指定された書式の文字列に変換するために使用されます。この場合、フォーマットは'YYYYMMDD'で、誕生日の年、月、日を表しています。結果の文字列の長さは8文字で、年は4文字、月は2文字、日は2文字で表されます。

ASキーワードは、結果のカラムの名前をbirth_dayに変更するために使用されます。このSELECT文の結果セットには、customer_idとbirth_dayという2つのカラムが含まれています。birth_day 列には、各顧客の誕生日が指定されたフォーマットで含まれています。

全体として、このコードは、customerテーブルからcustomer_idとbirth_dayカラムを取得し、birth_dayカラムを特定の方法でフォーマットしたい場合に便利です。このフォーマットされたデータは、分析またはレポート作成に便利です。

 

解説:

このコードはSQLで書かれており、customerというテーブルからデータを取得する。このコードの目的は、customerテーブルからcustomer_id列とapplication_date列を取得し、application_date列を日付形式に変換することである。

SELECT文を使用してcustomerテーブルからデータを取得し、LIMIT句を使用して返される行の数を10行に制限しています。

TO_DATE関数は、application_dateカラムを文字列から日付形式に変換するために使用されます。この場合、形式は'YYYYMMDD'で、申請日の年、月、日を表しています。結果として、日付の値は yyyy-mm-dd という形式になります。

ASキーワードは、結果のカラムをapplication_dateにリネームするために使用されます。このSELECT文の結果セットには、customer_idとapplication_dateという2つのカラムが含まれます。application_dateカラムには、各顧客の申込日が日付形式で含まれています。

全体として、このコードは、顧客テーブルから customer_id と application_date 列を取得し、application_date 列を日付形式に変換したい場合に便利です。このフォーマットされたデータは、特に日付の計算や比較が含まれる場合、分析またはレポート作成に便利です。
 
解説:

このコードはSQLで書かれており、receiptというテーブルからデータを取得する。このコードの目的は、reciportテーブルからreciport_no、reciport_sub_no、sales_ymd列を取得し、sales_ymd列を日付形式に変換することである。

SELECT文は、recipateテーブルからデータを取得するために使用され、LIMIT句は、返される行の数を10に制限するために使用されています。

CAST関数は、sales_ymdカラムを整数から文字列に変換するために使用されます。結果の文字列には、販売日の年、月、日が'YYYYMMDD'のフォーマットで含まれることになる。

TO_DATE関数は、sales_ymdの文字列を日付形式に変換するために使用されます。この場合、フォーマットは 'YYYYMMDD' で、これは販売日の年、月、日を表します。結果として得られる日付の値は、yyyy-mm-ddの形式となります。

AS キーワードは、結果のカラムを sales_ymd にリネームするために使用されます。このSELECT文の結果セットには、recipate_no、recipate_sub_no、およびsales_ymdの3つのカラムが含まれています。sales_ymdカラムには、各レシートの販売日が日付形式で含まれています。

全体として、このコードは、recipate_no、recipate_sub_no、および sales_ymd 列を receipt テーブルから取得し、sales_ymd 列を日付形式に変換したい場合に便利です。このフォーマット化されたデータは、特に日付の計算や比較が含まれる場合、分析またはレポート作成に便利です。
 
解説:

このコードはSQLで書かれており、receiportというテーブルからデータを取得する。このコードの目的は、recipateテーブルからrecipate_no、recipate_sub_no、sales_epoch列を取得し、sales_epoch列を日付形式に変換することである。

SELECT文を使用して領収書テーブルからデータを取得し、LIMIT句を使用して返される行の数を10行に制限しています。

TO_TIMESTAMP関数を使用して、sales_epochカラムを整数値からタイムスタンプ形式に変換しています。結果として得られるタイムスタンプは、1970年1月1日00:00:00 UTCからの秒数を表すことになります。

CAST関数は、タイムスタンプを日付形式に変換するために使用されます。この場合、結果の日付値はyyyy-mm-ddの形式となります。

AS キーワードは、結果のカラムの名前を sales_ymd に変更するために使用されます。このSELECT文の結果セットには、recipate_no、recipate_sub_no、およびsales_ymdの3つのカラムが含まれています。sales_ymdカラムには、各レシートの販売日が日付形式で含まれています。

全体として、このコードは receipt テーブルから receipt_no、recipate_sub_no、および sales_epoch 列を取得し、sales_epoch 列を日付形式に変換したいときに便利です。このフォーマットされたデータは、特に日付の計算や比較が含まれる場合、分析またはレポート作成に便利です。
 
解説:

このコードはSQLで書かれており、receiportというテーブルからデータを取得する。このコードの目的は、recipateテーブルからrecipate_no、recipate_sub_no、sales_epoch列を取得し、sales_epochのタイムスタンプ列から年を抽出することである。

領収書テーブルからデータを取得するためにSELECT文を使用し、LIMIT句を使用して返される行の数を10行に制限しています。

TO_TIMESTAMP関数を使用して、sales_epoch列を整数値からタイムスタンプ形式に変換します。結果として得られるタイムスタンプは、1970年1月1日00:00:00 UTCからの秒数を表すことになります。

EXTRACT関数は、sales_epochのタイムスタンプから年を抽出するために使用されます。結果として得られる値は、年を表す整数となります。

ASキーワードは、結果のカラムをsales_yearにリネームするために使用されています。このSELECT文の結果セットには、recipate_no、recipate_sub_no、およびsales_yearの3つのカラムが含まれています。sales_year列には、各レシートの販売日の年が含まれています。

全体として、このコードは receipt テーブルから receipt_no、recipate_sub_no、および sales_epoch 列を取得し、sales_epoch タイムスタンプ列から年を抽出したい場合に便利です。この抽出されたデータは、販売日の年号に基づいてデータをグループ化したりフィルタリングしたりするのに便利です。
 
解説:

このコードはSQLで書かれており、receiportというテーブルからデータを取得する。このコードの目的は、receiportテーブルからreciport_no、reciport_sub_no、sales_epoch列を取得し、sales_epochタイムスタンプ列から月を抽出し、結果の月を先頭ゼロの2桁の文字列にフォーマットすることである。

SELECT文は、レシートテーブルからデータを取得するために使用され、LIMIT句は、返される行の数を10に制限するために使用されます。

TO_TIMESTAMP関数を使用して、sales_epochカラムを整数値からタイムスタンプ形式に変換しています。結果として得られるタイムスタンプは、1970年1月1日00:00:00 UTCからの秒数を表すことになります。

EXTRACT関数は、sales_epochのタイムスタンプから月を抽出するために使用されます。結果の値は、月を表す整数となります。

TO_CHAR関数は、抽出された月を、必要に応じて先頭のゼロを含む文字列に変換するために使用される。FM00'フォーマット文字列は、結果の文字列が固定幅の2文字であることを指定し、先頭のゼロは削除される。

AS キーワードは、結果のカラムの名前を sales_month に変更するために使用されます。このSELECT文の結果セットには、recipate_no、recipate_sub_no、およびsales_monthの3つのカラムが含まれています。sales_monthカラムには、各レシートの販売日の月が、先頭の0を含む2桁の文字列として含まれています。

全体として、このコードは、reciportテーブルからreciport_no、reciport_sub_no、およびsales_epoch列を取得し、sales_epochタイムスタンプ列から月を抽出し、結果の月を、先頭がゼロの2桁の文字列としてフォーマットしたい場合に有用である。このフォーマットされたデータは、販売日の月に基づいてデータをグループ化またはフィルタリングするのに便利です。

 

解説:

このコードはSQLで書かれており、receiportというテーブルからデータを取得する。このコードの目的は、receiportテーブルからreciport_no、reciport_sub_no、sales_epoch列を取得し、sales_epochタイムスタンプ列から日を抽出し、結果の日を先頭ゼロの2桁の文字列にフォーマットすることである。

SELECT文は、レシートテーブルからデータを取得するために使用され、LIMIT句は、返される行の数を10に制限するために使用されます。

TO_TIMESTAMP関数を使用して、sales_epochカラムを整数値からタイムスタンプ形式に変換しています。結果として得られるタイムスタンプは、1970年1月1日00:00:00 UTCからの秒数を表すことになります。

EXTRACT関数は、sales_epochのタイムスタンプから日を抽出するために使用されます。結果の値は、日を表す整数になります。

TO_CHAR関数は、抽出された日を、必要に応じて先頭のゼロを含む文字列に変換するために使用されます。FM00'フォーマット文字列は、結果の文字列が固定幅の2文字であることを指定し、先頭のゼロは削除される。

AS キーワードは、結果のカラムの名前を sales_day に変更するために使用されます。このSELECT文の結果セットには、recipate_no、recipate_sub_no、sales_dayの3つのカラムが含まれています。sales_day列には、各レシートの販売日の日が、先頭の0を含む2桁の文字列として含まれています。

全体として、このコードは、reciportテーブルからreciport_no、reciport_sub_no、およびsales_epochカラムを取得し、sales_epochタイムスタンプカラムから日を抽出し、結果の日を、先頭のゼロを持つ2桁の文字列としてフォーマットしたい場合に有用である。このフォーマットされたデータは、販売日の日にちに基づいてデータをグループ化したりフィルタリングしたりするのに便利です。

 

解説:

このSQLコードは、recipateというテーブルからデータを選択しています。このコードの目的は、recipateテーブルの各顧客の売上金額の合計を計算することと、各顧客の売上金額の合計が2000より大きいか否かを示すフラグを作成することです。

SELECT文は、customer_id列、SUM関数で計算した各顧客の売上合計金額、売上合計金額が2000より大きい場合は1、それ以外は0を返すCASE式を取得する。フラグを含む結果のカラムは sales_flg と名付けられます。

WHERE句は、顧客IDが文字'Z'で始まるレコードをフィルタリングして除外します。これは、特定の顧客を計算やフラグ立てから除外するために使用することができます。

GROUP BY句は、顧客ごとに総売上金額とフラグが計算されるように、結果を顧客IDでグループ化します。

LIMIT句は、出力を最初の10個の結果に制限しています。

全体として、このコードは、レシート・テーブルの各顧客の売上合計額を計算し、売上合計額がある閾値(この場合、2000)より大きいかどうかを示すフラグを作成したい場合に便利です。これは、高額な買い物をする顧客を特定したり、顧客の売上金額を集計して分析する必要がある他のタイプの分析に役立つ可能性があります。

 

解説:

このSQLコードには、custという名前の共通テーブル式(CTE)が含まれており、customerテーブルからデータを選択して、postal_cdに基づいて各顧客のpostal_flgフラグを計算しています。

postal_flgフラグはCASE式を使用して計算され、postal_cdの最初の3文字が100から209(含む)であるかどうかをチェックし、真の場合は1、偽の場合は0という値を割り当てます。このフラグは、例えば郵便番号の範囲によって顧客をグループ化するために使用することができます。

rectという2番目のCTEは、recipateテーブルから個別のcustomer_idを選択します。

最後のSELECT文は、customer_id列でcustとrectのCTEを結合し、postal_flg列で結果をグループ分けしています。COUNT(DISTINCT c.customer_id)関数は、各 postal_flg値について異なる顧客の数を数えます。

全体として、このコードは、顧客テーブルと領収書テーブルに格納されているデータに基づいて、郵便番号の範囲によって顧客をグループ化し、各範囲の異なる顧客の数をカウントしたい場合に便利です。

 

解説:

このSQLコードは、customerテーブルから各顧客のcustomer_id、address、prefecture_cd codeを選択する。

このコードのCASE式は、address列の最初の3文字をチェックし、以下の条件に基づいて対応するprefecture_cdの値を割り当てます。

住所欄の最初の3文字が'埼玉県'であれば、prefecture_cd値は'11'に設定される。

住所欄の最初の3文字が'千葉県'の場合、prefecture_cd の値は'12'に設定される。

住所欄の最初の3文字が'東京都'の場合、prefecture_cdの値は'13'に設定される。

住所欄の最初の3文字が'神奈川'の場合、prefecture_cd の値は'14'に設定される。

このコードは、顧客テーブルに格納されている住所情報をもとに、顧客を都道府県別に分類したい場合に有効である。結果として得られるprefecture_cdカラムは、さらなる分析やグループ分けに利用できる。

 

 
解説:

このSQLコードは、customerテーブルから各顧客のcustomer_id、address、prefecture_cd codeを選択する。

このコードのCASE式は、正規表現パターン'^.*?[都道府県]'を使って住所列から都道府県名を抽出し、以下の条件に基づいて対応するprefecture_cd値を割り当てています。

抽出された都道府県名が'埼玉県'である場合、prefecture_cd 値は'11'に設定される。
抽出された都道府県名が '千葉県' の場合、prefecture_cd の値は '12' に設定される。
抽出された都道府県名が'東京都'の場合、prefecture_cd の値は'13'に設定される。
抽出された都道府県名が'神奈川県'の場合、prefecture_cdの値は'14'に設定される。

このコードは、前の例と似ていますが、SUBSTR関数の代わりにSUBSTRING関数を使って住所欄から都道府県名を抽出しています。正規表現パターン「^.*?[都道府県]」は、任意の文字(^.*?)で始まり、都、道、府、県のいずれかの文字で終わる文字列にマッチします。このコードは、顧客テーブルの住所情報が標準化されておらず、都道府県名の書式にばらつきがある場合に有効である。作成されたprefecture_cdカラムは、さらなる分析やグループ化に使用することができる。
 
解説:

このSQLコードは、customerという名前のテーブルに対してクエリを実行し、最初の10行のcustomer_id、address、prefecture_cdカラムを選択しています。prefecture_cd列は、LIKE演算子を使用したaddress列と一致するようにCASE文を使用して作成されています。

具体的には、CASE文は、日本の都道府県(埼玉県%、千葉県%、東京都%、神奈川県%)の後に任意の文字列が続く文字列パターンとLIKE演算子を使用して住所カラムをチェックする。住所カラムがいずれかのパターンに一致する場合、対応する都道府県コード(11、12、13、14)がprefecture_cdカラムに付与される。

このコードは、先に示した他の2つの例と比較して、住所欄から都道府県コードを抽出する代替的な方法である。
 
解説:

このSQLコードは、次のタスクを実行します。

SUM関数を使用して、顧客IDごとにレシートテーブルの金額列を合計し、顧客IDでグループ化することにより、各顧客の売上金額の合計を計算します。結果のテーブルは、sales_amountという名前のサブクエリとして保存されます。

窓関数であるPERCENTILE_CONT関数を使用して、sales_amountサブクエリからsum_amountカラムの四分位数(25位、50位、75位)を計算する。

CROSS JOIN操作でsales_amountサブクエリとsales_pctサブクエリを結合し、sales_amountテーブルの各行について四分位値を取得します。

最後に、新しい列pct_groupを計算し、売上総額に基づいて各顧客にパーセンタイル・グループを以下のように割り当てます。

1:sum_amountが25パーセンタイルより小さい場合(pct25)
2:sum_amountが25パーセンタイル以上50パーセンタイル未満の場合(pct50)。
3:sum_amountが50パーセンタイル以上75パーセンタイル未満の場合(pct75)。
sum_amount が 75 パーセンタイル以上であれば 4。

最終結果は、最初の10行に限定されます。
 
解説:

このコードは、customerテーブルからcustomer_id、birth_day、era(計算フィールド)を選択しています。eraフィールドは、顧客の年齢(明示的に選択されていないが、計算に使用される)を決定し、10年未満に切り捨てられた年齢と60との間の低い値を取ることによって計算される。

結果はcustomer_idとbirth_dayでグループ化されます。次に、HAVING句を使用して、年齢が60未満の顧客をフィルタリングしています。

要するに、このコードは、顧客テーブルから顧客の情報を選択し、年齢と時代を計算し、customer_idとbirth_dayによって結果をグループ化し、時代が60未満の顧客をフィルタリングしています。
 
解説:

このSQLコードは、customer_id、birth_day、そしてgender_cdとeraからなる連結された文字列を選択する。eraは顧客の年齢を10年単位で切り捨てたもので、最大eraは60歳です。gender_eraの文字列は、gender_cdとeraを連結することで生成されます。

SQLコードは、customer_idとbirth_dayで結果をグループ化し、結果の最初の10行のみを返します。

全体として、このコードは年齢と性別を含む顧客データの要約を作成し、さらに時代のディメンションを追加します。作成されたテーブルは、年齢と性別に基づく顧客のさらなる分析やセグメンテーションに使用できる可能性があります。

 

解説:

このSQLコードは、customer_idを選択し、3つの新しい列、gender_cd_0、gender_cd_1、gender_cd_9を作成します。これらの新しいカラムは、CASE文を使用して作成されています。

CASE文は条件文であり、一連の条件を評価し、対応する結果を返します。この場合、各顧客について、コードはgender_cdカラムの値をチェックする。gender_cd が '0' に等しい場合、コードは gender_cd_0 列に '1' を返し、他の列には '0' を返します。gender_cd が '1' の場合、コードは gender_cd_1 カラムに '1' を返し、他のカラムに '0' を返す。gender_cd が '9' に等しい場合、コードは gender_cd_9 カラムに '1' を、その他のカラムに '0' を返します。

結果の出力は customer_id、gender_cd_0、gender_cd_1、gender_cd_9 列を持ち、各顧客について、新しい列の1つだけが顧客の性別を示す '1' という値を持つことになる。
 
解説:

このコードはSQL言語で書かれており、SQLをサポートするデータベース管理システムを使っています。

このコードは、recipateというテーブルに対してデータ分析タスクを実行しています。このテーブルには、customer_id や金額などの列を持つトランザクション・データが含まれています。

このコードは、共通テーブル式(CTE)を使用して、2つの一時テーブルsales_amountとstats_amountを作成しています。

sales_amountという名前の最初のCTEは、文字'Z'で始まらないcustomer_idを持つ各顧客が使った金額の合計を計算しています。取引データをcustomer_idでグループ化し、各customer_idの金額の合計を計算しています。

stats_amountという名前の2番目のCTEは、各顧客が使用した合計金額の平均と標準偏差を計算しています。

最後のSELECT文は、sales_amountテーブルからカラムを選択し、クロスジョインを使用してstats_amountテーブルと結合します。また、合計金額から平均金額を引き、それを標準偏差で割ることで、各顧客が使用した標準化された金額を計算しています。

最後のLIMIT 10は、出力を最初の10行に制限しています。

全体として、このコードは取引データに対して統計分析を行い、文字 'Z' で始まる customer_id を持たない各顧客が使用した標準化された金額を算出しています。

 

 
解説:

このコードは前のコードと非常によく似ていますが、stats_amount CTEに重要な違いが1つあります。

標準偏差の計算にSTDDEV_POP関数を使用する代わりに、STDDEV_SAMP関数を使用しています。

STDDEV_SAMPは、データのサンプルに基づく母集団の標準偏差の推定値であるサンプル標準偏差を計算します。

これに対してSTDDEV_POPは、母集団全体が分析可能であると仮定して、正確な母集団標準偏差を計算する。

つまり、このコードの出力は前のものと似ていますが、標準偏差の計算は母集団全体ではなく、データのサンプルに基づくことになります。

一般に、データセットが非常に大きい場合、サンプルと母集団の標準偏差の差は小さくなります。しかし、データセットが小さければ、その差は大きくなる可能性があります。

 

解説:

このコードもレシート・テーブルを解析していますが、標準化された金額を計算する代わりに、各顧客が使用した秤量された金額を計算しています。

このコードでは、sales_amountとstats_amountという2つのCTEを使用していますが、これは前のコードと同様です。

最初のCTEは、文字「Z」で始まらないcustomer_idを持つ各顧客が使った合計金額を計算し、2番目のCTEは、任意の顧客が使った合計金額の最大値と最小値を計算しています。

最後のSELECT文は、sales_amountテーブルからカラムを選択し、クロスジョインを使用してstats_amountテーブルと結合しています。

また、各顧客が使用したスケーリングされた金額を計算します。これは、使用した合計金額から使用した最小金額を引き、使用した合計金額の範囲で割ったもので、最大金額と最小金額の差になります。

式の前の1.0 *は、結果を浮動小数点数に変換するために使用されます。これは、式で使用される値のいずれかが浮動小数点数である場合に必要です。

最後のLIMIT 10は、出力を最初の10行に制限しています。

全体として、このコードは、文字「Z」で始まるcustomer_idを持たない各顧客が費やした金額(scaled amount)を求めるというデータ分析タスクを実行しています。スケーリングされた金額とは、0から1の間の値で、すべての顧客が使った総額の範囲に対する、各顧客が使った総額の割合を表しています。

 

 

Comment