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

データサイエンス
解説:

これは、データベースからデータを取得するSQLクエリです。ステップバイステップで分解してみましょう。

クエリは%%sqlマジックコマンドで始まりますが、これはJupyterノートブックで次のコードがSQLコードであることを指定するために使用されます。

メインクエリでは、customer_id、sum_amount、log_amountという3つのカラムを選択します。これらのカラムは、括弧内のサブクエリから派生することになります。

括弧内のサブクエリでは、まず、customer_id が文字 "Z" で始まるレコードをすべてフィルタリングして除外します。これは、NOT LIKE 'Z%'という条件によって行われます。

フィルタリングされたレコードは、GROUP BY句を使用してcustomer_idでグループ化されます。

SUM関数は、各顧客IDの合計金額を計算するために使用されます。

AS sum_amount句は、計算されたカラムをsum_amountに名前を変更します。

サブクエリはsum_amount_tblとしてエイリアスされます。

最後に、外側クエリはcustomer_id、sum_amount、sum_amountに0.5を加えた対数(ベースe)を選択します。これはLOG関数を使って計算され、log_amountという別名が付けられています。

結果はLIMIT句で10行に制限されています。
 
解説:

これは、データベースからデータを取得するSQLクエリです。ステップバイステップで分解してみましょう。

クエリは%%sqlマジックコマンドで始まりますが、これはJupyterノートブックで次のコードがSQLコードであることを指定するために使用されます。

メインクエリでは、customer_id、sum_amount、log_amountという3つのカラムを選択します。これらのカラムは、括弧内のサブクエリから派生することになります。

括弧内のサブクエリでは、まず、customer_id が文字 "Z" で始まるレコードをすべてフィルタリングして除外します。これは、NOT LIKE 'Z%'という条件によって行われます。

フィルタリングされたレコードは、GROUP BY句を使用してcustomer_idでグループ化されます。

SUM関数は、各顧客IDの合計金額を計算するために使用されます。

AS sum_amount句は、計算されたカラムをsum_amountに名前を変更します。

サブクエリはsum_amount_tblとしてエイリアスされます。

最後に、外側クエリはcustomer_id、sum_amount、sum_amountの自然対数(底e)プラス0.5を選択する。これはLN関数を使って計算され、log_amountという別名が付けられています。

結果は、LIMIT句で10行に制限されます。
 
解説:

これは、データベースからデータを取得するSQLクエリです。ステップバイステップで分解してみましょう。

クエリは%%sqlマジックコマンドで始まり、これはJupyterノートブックで次のコードがSQLコードであることを指定するために使用されます。

メインクエリでは、product_cd、unit_price、unit_cost、unit_profitの4つのカラムを選択します。これらのカラムはproductテーブルから派生します。

FROM句は、製品テーブルを指定します。

LIMIT句は、クエリによって返される行の数を10に制限します。

このクエリでは、単価から単価を引くことでユニット・プロフィットを計算します。これは - 演算子を使用して行われます。

クエリの結果には、productテーブルの最初の10行のproduct_cd、unit_price、unit_cost、unit_profitが含まれています。

全体として、このクエリは、選択した製品の価格、コスト、および利益に関する情報を取得します。

 

解説:

このコードはSQLを使って、「product」というデータベーステーブルの上位10商品の平均単価利益率を照会しています。以下、コードの各部の解説をします。

"%%sql "はJupyter notebookのマジックコマンドで、以下のコードをSQLとして解釈するようにノートブックに指示します。

"SELECT "は、データベースからデータを取得することを示すSQLキーワードです。

"AVG "は、与えられた値の集合の平均を計算するSQL関数です。

"((unit_price * 1.0 - unit_cost) / unit_price)" は、各商品の単位利益率を計算する計算式です。単価から単価を差し引き、その結果を単価で割るというものです。1.0の乗算は、除算が整数値ではなく、浮動小数点値を返すようにするために行われます。

"AS unit_profit_rate" は、計算された値を "unit_profit_rate" というカラムに代入します。

"FROM product "は、"product "テーブルからデータを取得することを指定する。

「LIMIT 10」は、返される行数を10行に制限します。つまり、何らかの基準(コードスニペットでは指定されていません)で上位10個の製品の結果のみを表示することを意味します。

 

解説:

このコードでは、SQLを使用して、"product "というデータベーステーブルの修正版を照会しています。修正内容は、各商品の単価から新しい価格を算出し、この新しい価格を使って新しい利益率を算出しています。以下、コードの各部を説明します。

"%%sql "はJupyter notebookのマジックコマンドで、次のコードをSQLとして解釈するようノートブックに指示します。

"WITH new_price_tbl AS (...)" は "new_price_tbl" という Common Table Expression (CTE) をセットアップしています。これにより、後続のクエリで使用できるサブクエリを定義することができます。

"( SELECT product_cd, unit_price, unit_cost, TRUNC(unit_cost / 0.7) AS new_price FROM product ) "は、「product」テーブルからデータを選択し、単価に基づいて新しい価格を計算し、「new_price」という新しい列に割り当てるサブクエリである。TRUNC」関数を使用して、計算された新価格を最も近い整数に切り捨てています。これは、会社が製品の価格を整数値で決めたいという仮定に基づいています。

"SELECT *, (new_price - unit_cost) / new_price AS new_profit_rate FROM new_price_tbl LIMIT 10 ; "は、"new_price_tbl "からすべての列を選択するメインクエリーです。CTEで、各商品の新しい利益率を計算します。新しい利益率は、新しい価格から単価を引き、その結果を新しい価格で割って、「new_profit_rate」という新しいカラムに代入することで計算されます。LIMIT 10」句は、返される行数を10行に制限します。つまり、何らかの基準(コード・スニペットでは指定されていません)によって上位10商品の結果のみを表示したいのです。
 
解説:

このコードはSQLで書かれており、「new_price_tbl」という名前の共通テーブル式(CTE)を使用して「product」という名前のテーブルからデータを選択するために使用されます。このコードでは、各商品の単価を0.7で割って新しい価格を算出し、新しい価格から単価を引き、その結果を新しい価格で割って新しい利益率を算出しています。

以下、コードのステップ・バイ・ステップの内訳を示します。

WITH new_price_tbl AS (...): これは、括弧で囲まれたSELECT文のデータを一時的に保存するために使用される「new_price_tbl」という名前の共通テーブル式(CTE)を定義しています。

SELECT product_cd, unit_price, unit_cost, ROUND(unit_cost / 0.7) AS new_price FROM product: これは、商品コード、単価、単価を選択し、各商品の単価を0.7で割り、その結果を丸めることで新しい価格を計算します。

SELECT *, (new_price - unit_cost) / new_price AS new_profit_rate FROM new_price_tbl LIMIT 10: これは 'new_price_tbl' CTEからすべての列を選択し、新価格から単価を引き、その結果を新価格で割ることによって新利益率を計算する。最後に、出力を最初の10行に制限しています。

まとめると、このコードは、CTEを使って必要なデータを一時的に保存し、そのデータに対して算術演算を行うことで、各商品の新価格と新利益率を算出しています。
 
解説:

このコードは前のコードと似ていますが、新しい価格を四捨五入する代わりに、CEIL関数を使用して最も近い整数に切り上げられます。

以下、コードのステップ・バイ・ステップの内訳を示します。

WITH new_price_tbl AS (...): これは、括弧で囲まれたSELECT文のデータを一時的に保存するために使用される「new_price_tbl」という名前の共通テーブル式(CTE)を定義しています。

SELECT product_cd, unit_price, unit_cost, CEIL(unit_cost / 0.7) AS new_price FROM product: これは、商品コード、単価、単価を選択し、各商品の単価を0.7で割り、CEIL関数で小数点以下を切り上げて、新しい価格を計算します。

SELECT *, (new_price - unit_cost) / new_price AS new_profit_rate FROM new_price_tbl LIMIT 10: これは 'new_price_tbl' CTEからすべての列を選択し、新価格から単価を引き、結果を新価格で割ることによって新利益率を計算する。最後に、出力を最初の10行に制限しています。

まとめると、このコードは、CTEを使って必要なデータを一時的に保存し、そのデータに対して算術演算を行うことで、各商品の新価格と新利益率を算出しています。ただし、新しい価格は、前のコードのように丸めるのではなく、CEIL関数を使用して最も近い整数に切り上げられます。
 
解説:

このコードはSQLで書かれており、'product'という名前のテーブルからデータを選択するために使用されます。このコードでは、商品コード、単価を選択し、各商品の税込価格を計算します。単価に1.1を掛け、結果を切り捨てて小数点以下を削除しています。

以下は、コードのステップバイステップの内訳です。

SELECT product_cd, unit_price, TRUNC(unit_price * 1.1) AS tax_price FROM product: 商品コード、単価を選択し、各商品の税込価格を計算します。単価に1.1を掛け、TRUNC関数で小数点以下を切り捨てています。

FROM product: データを選択する「商品」テーブルを指定します。

LIMIT 10:出力を最初の10行に制限します。

要約すると、このコードでは、各商品の単価に1.1を掛けて税込価格を計算し、TRUNC関数で小数点以下を切り捨てています。
 
解説:

このコードはSQLで書かれており、「amount_all」と「amount_07」という2つの共通テーブル式(CTE)を使用して、「recipate」と「product」という2つのテーブルからデータを選択するために使用されています。このコードでは、各顧客が使用した金額の合計と、メジャー・カテゴリー・コードが「07」である商品に使用した金額の合計を計算します。その後、2つのCTEを結合し、各顧客のカテゴリ「07」商品の販売率を計算します。

以下は、コードのステップ・バイ・ステップです。

WITH amount_all AS(...)。これは、括弧で囲まれたSELECT文のデータを一時的に保存するために使用される「amount_all」という名前の共通テーブル式(CTE)を定義しています。

SELECT customer_id, SUM(amount) AS sum_all FROM receipt GROUP BY customer_id: これは、顧客IDと各顧客が使用した金額の合計を「reciption」テーブルから選択し、その結果を顧客IDでグループ化します。

また、amount_07 AS(...)を使用します。これは、括弧で囲まれたSELECT文のデータを一時的に保存するために使用される「amount_07」という名前の別のCTEを定義しています。

SELECT r.customer_id, SUM(r.amount) AS sum_07 FROM receipt r JOIN product p ON r.product_cd = p.product_cd WHERE p.category_major_cd = '07' GROUP BY customer_id: これは、顧客IDとメジャー・カテゴリー・コードが'07'の製品に費やされた金額の合計を'reciport'と'product'テーブルから選択し、製品コードで2つのテーブルを結合し、メジャー・カテゴリー・コード'07'で製品をフィルタし、顧客IDで結果をグループ化します。

SELECT amount_all.customer_id, sum_all, sum_07, sum_07 * 1.0 / sum_all AS sales_rate FROM amount_all JOIN amount_07 ON amount_all.customer_id = amount_07. customer_id LIMIT 10: これは、顧客ID、各顧客が使ったすべての金額の合計、各顧客がカテゴリー「07」製品に使った金額の合計、カテゴリー「07」製品に使った金額の合計を顧客が使ったすべての金額の合計で割ることによって各顧客のカテゴリー「07」製品の販売率を選択する。最後に、顧客 ID で 2 つの CTE を結合し、出力を最初の 10 行に制限しています。

要約すると、このコードは、まず各顧客の全消費金額の合計と各顧客のカテゴリー「07」製品への消費金額の合計を計算し、後者を前者で割ることによって、各顧客のカテゴリー「07」製品の販売率を計算する。これは、2つのCTEを使って必要なデータを一時的に保存し、そのデータに対して算術演算と結合を行うことで実現する。
 
解説:

このコードはSQLで書かれており、「receipt_distinct」という名前の共通テーブル式(CTE)を使用して、「receipt」と「customer」という名前の2つのテーブルからデータを選択するために使用されています。このコードでは、顧客の申込日と、その顧客が行った別個の販売日の間に経過した日数を計算しています。

以下はコードのステップ・バイ・ステップの内訳です。

WITH receipt_distinct AS(...)とします。これは、括弧で囲まれたSELECT文のデータを一時的に保存するために使用される「receipt_distinct」という名前の共通テーブル式(CTE)を定義しています。

SELECT distinct customer_id, sales_ymd FROM receipt: これは、'receipt'テーブルからdistinct customer IDとsales year-month-dayを選択するものである。

SELECT c.customer_id, r.sales_ymd, c.application_date, EXTRACT(DAY FROM (TO_TIMESTAMP(CAST(r.sales_ymd AS VARCHAR), 'YYYYMMDD') - TO_TIMESTAMP(c.application_date, 'YYYYMMDD')) )) AS elapsed_days FROM receipt_distinct r JOIN customer c ON r.customer_id = c.customer_id LIMIT 10: これは、顧客ID、売上年月日、申込日、顧客の申込日からその顧客が販売した明細の日付までの経過日数を選択する。経過日数の計算は、売上年月日と申込日をタイムスタンプに変換し、その差を日数で計算する。最後に、「receipt_distinct」CTEと「customer」テーブルを顧客IDで結合し、出力を最初の10行に制限しています。

要約すると、このコードでは、まず 'receipt' テーブルから顧客 ID と売上年・月・日を選択し、それを 'customer' テーブルと結合して顧客の申込日を取得することにより、顧客の申込日とその顧客が行った個別の売上日の間に経過した日数を計算しています。次に、売上年月日と申込日をタイムスタンプに変換し、その差を日数で計算する計算が行われる。これは、CTEを使用して必要なデータを一時的に保存し、そのデータに対して算術演算と結合を行うことで実現する。

 

解説:

このコードはSQLで書かれており、「recipate_distinct」と「time_age_tbl」という2つの共通テーブル式(CTE)を使用して、「recipate」と「customer」という2つのテーブルからデータを選択するために使用されています。このコードでは、顧客の申込日と、その顧客が行った別個の販売日の間の経過月数を計算しています。

以下は、コードのステップバイステップです。

WITH receipt_distinct AS (...): これは、括弧で囲まれたSELECT文のデータを一時的に保存するために使用される「receipt_distinct」という名前の共通テーブル式(CTE)を定義しています。

SELECT DISTINCT customer_id, sales_ymd FROM receipt: これは、'receipt'テーブルからdistinct customer IDとsales year-month-dayを選択するものである。

WITH time_age_tbl AS (...): これは、括弧で囲まれたSELECT文のデータを一時的に保存するために使用される「time_age_tbl」という名前の別のCTEを定義するものである。

SELECT c.customer_id, r.sales_ymd, c.application_date, AGE(TO_TIMESTAMP(CAST(r.sales_ymd AS VARCHAR), 'YYYYMMDD'), TO_TIMESTAMP(c.application_date, 'YYYYMMMDD'))) AS time_age FROM receipt_distinct r JOIN customer c ON r.customer_id = c.customer_id: これは、顧客ID、売上年月日、申込日、および顧客の申込日からその顧客が行った個別の売上日までの経過時間を選択するものです。経過時間の計算では、売上年月日と申込日をタイムスタンプに変換し、AGE関数を用いてその差を計算する。最後に、「receipt_distinct」CTEと「customer」テーブルを顧客IDで結合しています。

SELECT customer_id, sales_ymd, application_date, EXTRACT(YEAR FROM time_age) * 12 + EXTRACT(MONTH FROM time_age) AS elapsed_months FROM time_age_tbl LIMIT 10: これは顧客ID、売上年月日、申し込み日、顧客の申し込み日からその顧客が行った個別の売上日までの経過月数を選択するもの。経過月数の計算では、経過時間の年成分と月成分を抽出し、月数に変換しています。最後に、出力を最初の10行に限定しています。

要約すると、このコードでは、まず「recipate」テーブルから顧客IDと売上年月を選択し、「customer」テーブルと結合して顧客の申込日を取得することで、顧客の申込日からその顧客が行った個別の売上日までの経過月数を計算します。次に、CTEとAGE関数を使って、売上年月日と申込日の間の経過時間を計算し、その結果を月単位に変換する。これは、2つのCTEを使用して必要なデータを一時的に保存し、そのデータに対して算術演算と結合を実行することによって行われます。
 
解説:

このSQLコードは、購入した顧客の顧客ID、販売日、申込日を取得し、申込日と販売日の間の経過年数を計算する。

このコードでは、まず、receipt_distinct という共通のテーブル式を作成し、receipt テーブルから顧客 ID と販売日の個別の組み合わせを選択します。これにより、各顧客が複数回購入した場合でも、1回しかカウントされないことが保証されます。

メインクエリでは、receipt_distinctテーブルから顧客ID、販売日、申込日を選択し、EXTRACT関数を使用して申込日と販売日の間の経過年数を計算する。AGE関数で2つの日付の時間差を計算し、EXTRACT関数で結果の間隔から年成分を抽出する。

結果は、各顧客の顧客ID、販売日、申込日、経過年数を示す表となる。LIMIT句は、結果セットの最初の10行に出力を制限するために使用される。

 

解説:

このSQLコードは、購入した顧客の顧客ID、販売日、申込日を取得し、申込日と販売日の間の経過秒数を計算する。

このコードでは、まず、receipt_distinct という共通のテーブル式を作成し、receipt テーブルから顧客 ID と販売日の個別の組み合わせを選択します。これにより、各顧客が複数回購入した場合でも、1回しかカウントされないことが保証されます。

次にメインクエリでは、receipt_distinctテーブルから顧客ID、売上日、申込日を選択し、EXTRACT関数とTO_TIMESTAMP関数を使って、申込日と売上日の間の経過秒数を計算します。EXTRACT(EPOCH FROM <interval>)関数を使用して、結果の間隔から秒数を抽出しています。

結果は、各顧客の顧客ID、販売日、申込日、経過秒数を示す表である。LIMIT句は、結果セットの最初の10行に出力を制限するために使用されます。
 
解説:

このSQLコードは、elapsed_days_tblという名前の共通テーブル式(CTE)を定義することから始まります。このCTEは、レシート・テーブルの各 sales_ymd 日付の曜日(0から6までの数字で、0は日曜日)を抽出します。

メインクエリでは、elapsed_days_tbl CTEからsales_ymdとelapsed_daysが選択されています。次に、このコードでは、sales_ymdからelapsed_daysを引くことで新しい日付を計算します。これは、elapsed_days を整数としてキャストし、sales_ymd から減算することで行われます。結果の日付は、sales_ymdの日付に対応する週の月曜日となります。

コードの最後にあるLIMIT 10句は、出力を最初の10行に制限しています。
 
解説:

このSQLコードは、customerテーブルから10人の顧客のランダムなサブセットを選択するものです。RANDOM()関数は、テーブルの各行に対して0から1の間のランダムな値を生成し、WHERE句は、生成された値が0.01以下(選択される確率1%)であるかどうかに基づいて行をフィルタします。

これは、テーブルの他の条件や順序に関係なく、各行が選択される確率が等しいことを意味します。LIMIT句は、条件を満たす最初の10行に出力を制限するために使用されます。
 
 
解説:

このコードは、SQLプログラミング言語を使用して、"customer "テーブルから顧客のランダムなサブセットを選択するものです。

このコードでは、まず「customer」テーブルからすべての列を選択し、ROW_NUMBER関数とCOUNT関数を使用して2つの列を追加して「customer_tmp」という一時テーブルを作成します。

ROW_NUMBER関数は、ORDER BY RANDOM()句の結果に基づいて、テーブルの各行に対して一意の整数を割り当てます。これにより、テーブルの行の順序が効果的にランダム化されます。

OVER()句を持つCOUNT関数は、テーブル内の行の総数を数え、各行のこの数を含む "cnt "という新しい列を作成します。

次にメインのSELECT文は、ROW_NUMBER関数で作成された「row」列でフィルタリングして、一時テーブルから顧客のサブセットを選択する。具体的には、COUNT関数で作成された "cnt "カラムによって決定される、最初の1%の行を選択します。

最後の句「LIMIT 10」は、結果をサブセットの最初の10行に制限し、元の「customer」テーブルから10人の顧客のランダムサンプルを効果的に返します。

全体として、このコードは、テストや探索的分析の目的で、大きなテーブルから顧客のランダムなサンプルを選択する簡単な方法です。サンプリングの割合(この場合は1%)を調整することで、より大きなサンプルや小さなサンプルを作成することができます。
 
解説:

このSQLコードは、"customer "というテーブルから顧客のランダムなサンプルを選択し、サンプル内の各性別に該当する顧客の数を算出しています。

以下は、コードの各パートが行っていることの内訳です。

WITH句。WITH句:この句は、後続のSELECT文で使用する2つの一時テーブル、「customer_random」と「customer_rownum」を作成します。

customer_randomテーブル。このテーブルは、「customer」テーブルから顧客のランダムなサンプルを選択し、各顧客に性別に基づく「customer_r」値を割り当てる。cnt」列は、各性別グループの顧客の総数をカウントする。

customer_rownumテーブル。このテーブルは、「customer_random」テーブルの各顧客に、性別で仕切られた行番号("rn")を追加する。

SELECTステートメント。この文は、各性別グループにおいて、行番号がその性別グループにおける顧客の総数の10%以下である顧客の数を数える(すなわち、行番号による顧客の上位10%の顧客である)。結果は、「gender_cd」と「customer_num」の2つの列を持つ表で、「gender_cd」は性別コード、「customer_num」はその性別グループの中で行番号で上位10%に入る顧客の数である。

全体として、このコードは、より大きなデータセットから顧客のランダムなサンプルを選択し、その性別分布を分析するのに便利です。
 
解説:

このコードはSQLプログラミング言語を使用して、「customer」テーブルから顧客のサブセットをランダムに選択し、性別でグループ化し、各性別グループの顧客数を返すものです。

このコードでは、まず「customer」テーブルからすべての列を選択し、ROW_NUMBER関数とCOUNT関数を使用して2つの列を追加して「cusotmer_random」という一時テーブルを作成します。

ROW_NUMBER関数は、ORDER BY RANDOM()句の結果に基づいて、テーブルの各行に対して一意の整数を割り当てます。これは、テーブルの行の順序を効果的にランダム化します。

ROW_NUMBER関数のPARTITION BY gender_cd句は、ランダムな順序が各性別グループに対して別々に行われることを保証します。

OVER(PARTITION BY gender_cd)句を持つCOUNT関数は、各性別グループの行の総数をカウントし、各行のこのカウントを含む「cnt」と呼ばれる新しい列を作成する。

次にメインのSELECT文は、ROW_NUMBER関数で作成された「rn」列でフィルタリングすることにより、一時テーブルから顧客のサブセットを選択する。具体的には、COUNT関数で作成された "cnt "カラムによって決定されるように、各性別グループの行の最初の10%を選択する。

WHERE句は、「cusotmer_random」テーブルの行をフィルタリングし、「rn」値がそれぞれの性別グループの「cnt」値の10%以下であるものだけを含める。

最後に、メインのSELECT文は、gender_cdによって行をグループ化し、各グループの行のカウントを返し、効果的にランダムサンプルの各性別グループの顧客の数を提供します。

全体として、このコードは、サンプルが元のテーブルと同様に各性別グループの割合を含むことを保証しながら、大きなテーブルから顧客のサブセットをランダムに選択する方法です。サンプリングの割合(この場合、10%)は、より大きいまたは小さいサンプルを作成するために調整することができます。
 
解説:

このコードは、SQLプログラミング言語を使用して、対数変換された購入金額に基づいて、購入金額の合計が標準から大きく外れている顧客を識別しています。

このコードでは、まず、「レシート」テーブルからcustomer_idと購入金額の合計を選択し、customer_idでグループ化して「sales_amount」という一時テーブルを作成します。また、購入金額の合計はLN関数を使って対数変換され、ゼロの対数を取らないように0.5が加算されます。

次にメインのSELECT文は、一時テーブルからcustomer_id、sum_amount、log_sum_amountカラムを選択する。また、CROSS JOINを使用して、"stats_amount "という別の一時テーブルに参加します。"stats_amount "は、"sales_amount "テーブルからlog_sum_amount列の平均と母標準偏差を選択して作成します。

WHERE句は、"sales_amount "テーブルの行をフィルタリングして、log_sum_amountと平均log_sum_amountの差の絶対値をlog_sum_amountの標準偏差で割って、3より大きいものだけを含めます。これは、購入金額が平均値から3標準偏差以上離れている顧客を特定する方法であり、統計分析において外れ値を特定するための一般的な閾値である。

最後に、メインのSELECT文は、出力を10行に制限しています。

全体として、このコードは、購入金額を対数スケールに変換し、統計的外れ値検出基準を適用することにより、データセットの平均購入金額に対して、著しく大きな購入または小さな購入を行った顧客を識別する方法である。
 
解説:

このコードは、データベースに問い合わせるためにSQLプログラミング言語を使用しています。具体的には、共通テーブル式(CTE)を使用して、「sales_amount」という一時テーブルを作成し、「recipate」テーブルの各顧客の売上合計額を算出しています。

CTEのWHERE句は、IDが "Z "で始まる顧客をフィルタリングして除外する。GROUP BY句は、顧客IDによって売上をグループ化します。

メインクエリでは、「sales_amount」テーブルと、PERCENTILE_CONT関数を使用して売上金額の25パーセンタイルと75パーセンタイルを計算するサブクエリとの間でCROSS JOINが実行されます。これらのパーセンタイルは、"stats_amount "という一時テーブルに格納されます。

最後に、メインクエリのWHERE句で、25パーセンタイルや75パーセンタイルから四分位範囲(IQR)の1.5倍以上離れている売上金額をフィルタリングして除外します。これは、データセットの外れ値を特定するための一般的な方法です。結果は、上位10行に限定されます。

全体として、このコードはデータベースを照会して、同業他社と比較して売上金額が異常に高い、または低い顧客を、四分位範囲内の位置に基づいて特定するものです。
 
解説:

このコードは、SQLプログラミング言語を使用してデータベースに問い合わせをしています。具体的には、"product "テーブルを照会し、SUM文とCASE文を組み合わせて、テーブルの各列にある欠損値(NULL)の数を数えています。

このクエリでは、6つのカラムを選択し、テーブルのカラム名と一致するエイリアスを付与しています。「product_cd」、「category_major_cd」、「category_medium_cd」、「category_small_cd」、「unit_price」、「unit_cost」。

各カラムについて、CASE文は値がNULLかどうかをチェックし、NULLの場合は1を、そうでない場合は0を返します。そして、SUM関数で1と0を合計して、各列のNULL値の総数を求めます。

LIMIT 10句は、結果をテーブルの最初の10行に制限しますが、この場合、要約統計にしか興味がないので、特に意味はないでしょう。

全体として、このコードは「product」テーブルの欠損データをチェックし、各列の欠損値の数の簡単な要約を得るための簡単な方法である。

 

解説:

このコードは、SQLプログラミング言語を使用して、「product」テーブルから「unit_price」列と「unit_cost」列の両方がNULLでない行だけを選択して、「product_1」という新しいテーブルを作成しています。

1行目の「DROP TABLE IF EXISTS product_1;」は、「product_1」テーブルがすでに存在するかどうかをチェックし、存在する場合は削除して、新しく作成するテーブルとの競合を避ける安全策である。

2行目の「CREATE TABLE product_1 AS (...); 」は、「product_1」という新しいテーブルを作成し、その内容はSELECT文の結果に基づいていることを指定します。

SELECT文はproductテーブルからすべての列を選択しますが、WHERE句が含まれており、unit_priceまたはunit_cost列がNULLである行をフィルタリングします。

全体として、このコードは、元の "product "テーブルから、"unit_price "と "unit_cost "の両方のカラムに有効なデータを持つ行だけを含む新しいテーブルを作成します。これは、データをクリーンアップし、分析やモデリングに備えるための一般的な方法です。データの欠落は、いくつかの分析手法で問題を引き起こすことがあるからです。




Comment