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は光る境界線効果を実現します

推薦する

Vue で AES.js を使用する詳細な手順

AES暗号化の使用データ転送の暗号化と復号化処理 --- AES.js最初のステップ: vue に ...

Linuxのwhichコマンドの具体的な使い方

Linux でファイルを見つけたいのに、その場所がわからないことがよくあります。次のコマンドを使用し...

Linux parted ディスク パーティション実装手順の分析

fdisk と比較すると、parted はあまり使用されず、主に 2T を超えるパーティションに使用...

Windows 10 での MySQL 5.7.17 のインストールと設定方法のグラフィック チュートリアル

この記事では、最新バージョンの MySQL データベース、つまり MySQL 5.7.17 圧縮バー...

vue3+TypeScript+vue-routerの使い方

目次使いやすいプロジェクトを作成するvue-cli 作成ヴィートクリエイションvue-routerを...

MySqlはページクエリ機能を実装します

まず、ページ分割クエリを使用する理由を明確にする必要があります。データが膨大なため、すべてのデータを...

Linux centos7 に phpMyAdmin をインストールするチュートリアル

yum install httpd php mariadb-server –yランプの動作環境を設定...

Vueタイムラインコンポーネントの使い方

この記事の例では、参考までにvueタイムラインコンポーネントの具体的な実装コードを共有しています。具...

優れたHTML印刷コードがページめくりをサポート

ylbtech_html_print HTML 印刷コード、ページめくりをサポートコードをコピーコー...

MySQL でスロークエリログを有効にする方法

1.1 はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメ...

MySQL 空間データストレージと関数

目次1. データ型1. MySQL空間データとは何か2. GeoJSONとは3. 空間データ型のフォ...

Vue サーバーに js 構成ファイルをインポートする方法

目次背景成し遂げるvue-cli2.0での設定方法の補足要約する背景プロジェクトにはローカル構成ファ...

複数のドメイン名、ポート、IP仮想ホストに基づくNginx構成

1. タイプの導入1.1 ドメインベースの仮想ホスティングいわゆるドメイン名ベースの仮想ホストとは、...

Vuex のモジュール化と名前空間の例のデモ

1. 目的:コードの保守が容易になり、さまざまなデータの分類が明確になります。 2. store/i...

小さな三角形の実装コードを含む CSS ナビゲーション バー メニュー

多くの Web ページにはナビゲーション バーに小さな三角形があり、この機能を実装するのは実は非常に...