MySQL実践ウィンドウ関数SQL分析クラスの生徒のテストの成績と生活費

MySQL実践ウィンドウ関数SQL分析クラスの生徒のテストの成績と生活費

1. 背景

本日、ニセ大学3年生の月例試験の結果が出ました。ここで各生徒の試験結果をお知らせします。

ここに画像の説明を挿入

次に、各学生の生活費についてお知らせします。

ここに画像の説明を挿入

次に、上記のテストのスコアと生活費の記録を使用して、MySQL で簡単な分析を行います。

もちろん、この記事のタイトルからもそれがわかります。この記事では、このデータを使用して、SQL の「ウィンドウ関数」の使用方法を説明します。

これは、将来 Hive または Oracle データベースを学習する場合や、データ分析の面接を受ける場合に非常に重要な知識ポイントになります。

2. テーブル作成ステートメントとデータ挿入

テーブルを作成する

テーブル exam_score を作成します(
    sname varchar(20)、
    年齢 int、
    件名varchar(20)、
    スコアvarchar(20)
)文字セット=utf8;

# ----------------------- #

テーブルcost_fee(を作成する
    sname varchar(20)、
    購入日付varchar(20),
    購入コスト int
)文字セット=utf8;

データの挿入

exam_score値に挿入
(「張三」18歳、「中国人」90歳)
(『張三』18歳、『数学』80歳)
(「張三」18歳、「英語」70歳)
(「李思」、21歳、「中国人」、88歳)、
(『李斯』21歳、『数学』78歳)
(「李思」、21歳、「英語」、71歳)、
(「王武」18歳、「中国人」95歳)
(『王武』18歳、『数学』83歳)
(「王武」18歳、「英語」71歳)
(「趙劉」、19歳、「中国人」、98歳)、
(『趙劉』19歳、『数学』90歳)
(「趙劉」、19歳、「英語」、80歳)
# ----------------------- #
cost_fee値に挿入
('張三','2019-01-01',10),
('張三','2019-03-03',23),
('張三','2019-02-05',46),
('李思','2019-02-02',15),
('李思','2019-01-07',50),
('李思','2019-03-04',29),
('王武','2019-03-08',62),
('王武','2019-02-09',68),
('王武','2019-01-11',75),
('趙劉','2019-02-08',55),
('趙劉','2019-03-10',12),
('趙劉','2019-01-12',80);

3. ウィンドウ関数分類の概要

「ウィンドウ関数」の応用について正式に議論する前に、まず「ウィンドウ関数」の基本を確認します。ウィンドウ関数は次のカテゴリに分類できます。

集計関数 + over() の組み合わせ。

ソート関数 + over() の組み合わせ。

ntile() 関数 + over() の組み合わせ。

オフセット関数 + over() の組み合わせ。

各カテゴリーの機能は何ですか?下のマインドマップをご覧ください。

ここに画像の説明を挿入

over() には、説明が必要なよく使われるキーワードが 2 つあります。次のように:

パーティション by + フィールド: これは、 グループ化」に使用されるキーワードである group by キーワードと考えることができます。

order by + フィールド: これは理解しやすく、「並べ替え」に使用されるキーワードです。

4. ウィンドウ関数の適用

上記では、よく使われる「ウィンドウ関数」をいくつか紹介してきました。ここでは、記事の冒頭で作成したデータを使用して、「ウィンドウ関数」の応用についてお話します。

各機能の意味については、それぞれのケースを通してまとめてもらえればと思うので、ここでは詳しく書きません。

1. 集計関数 + over()

①各生徒の得点と平均点を計算する

選択 
	名前
    、主題
    、スコア
    ,avg(スコア) over(sname によるパーティション) as avg_score
から
	試験スコア

結果は次のとおりです。

ここに画像の説明を挿入

②1月から3月までの各生徒の消費量と総消費量を計算する

選択
	名前
    、購入日
    、購入コスト
    ,sum(buycost) over(partition by sname) as sum_cost
から
	費用

結果は次のとおりです。

ここに画像の説明を挿入

③1月から3月までの各生徒の消費量と累計消費量を計算する

選択
	名前
    、購入日
    、購入コスト
    ,sum(buycost) over(partition by sname order by buydate) as sum_cost
から
	費用

結果は次のとおりです。

ここに画像の説明を挿入

注: ②③を組み合わせると、partition by を order by と組み合わせた場合と、order by なしで組み合わせた場合で、まったく異なる結果が生成されることがわかります。 1 つはグループの合計値を求める方法 (order by なし)、もう 1 つはグループの累積合計を求める方法 (order by あり) です。

2. ソート関数 + over()

① 各科目の順位を計算します。同じ得点でも順位が異なり、順番に順位が上がります。

選択
	名前
	、主題
	、スコア
    ,row_number() over(partition by subject order by score) rank1
から
	試験スコア

結果は次のとおりです。

ここに画像の説明を挿入

② 各科目の順位を計算します。同点の場合は順位はそのまま、それ以外は順位が上がります。

選択
	名前
	、主題
	、スコア
    ,rank() over(主題によるパーティション スコアによる順序) rank1
から
	試験スコア

結果は次のとおりです。

ここに画像の説明を挿入

③ 各科目の順位を計算します。同点のものは同順位、残りは昇順で順位付けします。

選択
	名前
	、主題
	、スコア
    ,dense_rank() over(件名によるパーティション、スコア順) rank1
から
	試験スコア

結果は次のとおりです。

ここに画像の説明を挿入

3. ntile() 関数 + over() の組み合わせ

ntile() 関数は少し場違いな感じがして、どのカテゴリに置けばよいかわかりません。この機能は主にデータのセグメンテーション」に使用されます。この関数の用途があるとすれば、それは、前述の row_number() 関数と同様に、データを並べ替えることができることです。

① exam_scoreテーブル全体を分割する

選択
	名前
	、主題
	、スコア
    ,ntile(4) ランク1以上
から
	試験スコア

結果は次のとおりです。

ここに画像の説明を挿入

信じられないなら試してみてください。ntile() にどんな数字を書いても動作するようです。

② exam_scoreテーブルを科目グループごとに分割する

選択
	名前
	、主題
    、スコア
    ,ntile(4) over(主題による分割) rank1
から
	試験スコア

結果は次のとおりです。

ここに画像の説明を挿入

グループごとに分けたとしても、スコアがソートされていないため意味がないことがわかります。

③ exam_scoreテーブルでは、スコアをソートし、科目ごとにグループ化して分割します(最も便利です)

選択
	名前
	、主題
    、スコア
    ,ntile(4) over(主題によるパーティション スコア順) rank1
から
	試験スコア

結果は次のとおりです。

ここに画像の説明を挿入

注: この使用法を注意深く観察すると、基本的には row_number() 関数と同等であり、効果も同じであることがわかります。

4. オフセット関数 + over() の組み合わせ

①生徒ごとの「前回購入時間」と「次回購入時間」を表示する

注: 最初の日には「最初の購入」と表示され、最後の日には「最後の購入と表示されます。

選択
	名前
	、購入日
    ,lag(buydate,1,'first day') over(partition by sname order by buydate) は最終購入時間として、lead(buydate,1,'last day') over(partition by sname order by buydate) は次回購入時間として
	費用

結果は次のとおりです。

ここに画像の説明を挿入

②本日時点の各生徒の「初回購入時刻」と「最終購入時刻」

選択
	名前
	、購入日
    、first_value(buydate) over(partition by sname order by buydate) は最初の購入日として、last_value(buydate) over(partition by sname order by buydate) は最後の購入日として
	費用

結果は次のとおりです。

ここに画像の説明を挿入

③各生徒の「初回購入時間」と「最終購入時間」を表示する

注意:ここでは「現時点」とは書いていませんので、②③の違いに注意してください。ニーズが異なれば結果も異なります。

選択
	名前
	、購入日
    、first_value(buydate) over(partition by sname order by buydate) は最初の購入日として、last_value(buydate) over(partition by sname ) は最後の購入日として
	費用

結果は次のとおりです。

ここに画像の説明を挿入

以上は、MySQLの実用的なウィンドウ関数SQLを使用して、クラスの生徒のテストの成績と生活費を分析する詳細です。スコアと消費のSQLウィンドウ関数分析の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • 非常に実用的なMySQL関数の包括的な概要、詳細な例の分析チュートリアル
  • MySQL データベースの基礎 SQL ウィンドウ関数の例の分析チュートリアル
  • mysql 計算関数の詳細
  • 単一行関数と文字計算日付プロセス制御を説明する MySQL の例
  • MySQL の基本: グループ化関数、集計関数、グループ化クエリの詳細な説明
  • MySQL関数の簡単な紹介
  • MySQL 空間データストレージと関数
  • MySQL関数の包括的な概要

<<:  HTML 左、中央、右の適応レイアウト (calc css 式を使用)

>>:  CSS3は光る境界線効果を実現します

推薦する

検証コード干渉を実装する js (静的)

この記事では、検証コード干渉を実装するためのjsの具体的なコードを参考までに共有します。具体的な内容...

Nginx ソースコードのコンパイルとインストールのプロセス記録

rpm パッケージのインストールは比較的簡単なので、ここでは説明しません。ほとんどのオープンソース ...

Linux でのルーティングと仮想マシン ネットワークの設定に関する詳細なグラフィック説明

ルーティングとは何ですか?ルーティングとは、相互接続されたネットワークを介して送信元ステーションから...

MySQLの詳細な分析で使用法と結果を説明します

序文日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行す...

Docker のインストールと構成イメージの高速化の実装

目次DockerバージョンCentOS に Docker エンジンをインストールするシステム要件古い...

MySQL5.7 mysqldump バックアップとリカバリの実装

MySQL バックアップコールドバックアップ:停止服務進行備份,即停止數據庫的寫入ホットバックアップ...

Django 2.2 を MySQL データベースに接続する方法

1. プロジェクトの実行時に報告されるエラー情報は次のとおりです。 ファイル "/home...

MySQL の「特殊キーが長すぎます」の解決策

目次解決策1解決策2テーブルを作成するときに、興味深い問題に遭遇しました。「指定されたキーが長すぎま...

TypeScript 名前空間のマージの説明

目次同じ名前の名前空間をマージする名前空間とその他の種類のマージ同じ名前の名前空間とクラスをマージす...

データベースクエリ、どのオブジェクトにどのフィールドが含まれているか、メソッドステートメント

データベースは、どのオブジェクトにどのフィールドが含まれているかを照会します。 *を選択 sysob...

WeChatアプレットは固定ヘッダーとリストテーブルコンポーネントを実装します

目次必要:機能ポイントレンダリング実装のアイデア具体的なコード(react\taro3.0)特定のコ...

Tomcat マルチレイヤーコンテナの設計に関する簡単な説明

目次コンテナ階層サーブレットの検索を要求するプロセス仕組みTomcat のコンテナは Servlet...

JavaScriptとTypeScriptの関係

目次1. JavaScript とは何ですか? 2. JavaScript は何に使用されますか? ...

画像を読み込むための JavaScript キャンバス

この記事では、画像を読み込むためのJavaScriptキャンバスの具体的なコードを参考までに紹介しま...

HTML 要素 (タグ) とその使用法

a : ハイパーリンクの開始位置または宛先位置を示します。頭字語: 単語の最初の文字からなる略語を示...