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

推薦する

Mysql ルートユーザーアカウントのパスワードをリセットする問題を解決する

問題の説明: mysqladmin.exe を使用してコマンドを実行すると、次のエラー メッセージが...

MySQL 5.7 でルートパスワードを変更する方法

MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...

Linuxはjoin -a1を使用して2つのファイルを結合します

次の2つのファイルを結合するには、それらを結合して1.txtに結合します。 # 1.txt ジェリー...

mysql の存在する例と存在しない例の詳細な説明

mysql の存在する例と存在しない例の詳細な説明テーブルA |列1 | 列1 | 列3 |テーブル...

WEBAPP開発スキルのまとめ(モバイルWebサイト開発の注意点)

1. レスポンシブな Web を開発するには、ページを画面サイズに適応させる必要があります。前の記...

MYSQL スロークエリとログ設定とテスト

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

HTML ページはダーク モードの実装をサポートします

2019年から、AndroidとiOSの両方のプラットフォームでダークモードが使用され始めました。も...

Mysql の大きな SQL ファイルの高速リカバリ ソリューションの共有

序文MySQL データベースを使用する過程では、データベースのバックアップと復元が必要になることがよ...

Bootstrap Webページレイアウトグリッドの実装

目次1. Bootstrapグリッドシステムの仕組み1.1 12グリッドシステム1.2 Bootst...

CentOS 7 での Nginx ログタイミング分割の実装手順の詳細説明

1. 分割スクリプト (splitNginxLog.sh) を作成します。 * この例では、ログ分割...

Dockerを使用してSpringBootプロジェクトをデプロイする方法

Docker テクノロジの開発により、マイクロサービスの実装にさらに便利な環境が提供されます。Doc...

CentOS6.8 は cmake を使用して MySQL5.7.18 をインストールします。

オンライン情報を参考に、cmakeを使用してCentOS6.8サーバーにMySQL5.7.18をイン...

CentOS6.8 中国語/英語環境切り替えチュートリアル図

1. はじめに英語に慣れていない人は、システムを英語から中国語に変更したいかもしれません。一方、クラ...

VueはSplitを使用して、ユニバーサルドラッグアンドスライドパーティションパネルコンポーネントをカプセル化します。

目次序文始める基本レイアウトデータバインディングイベントバインディング最適化ジッター問題を最適化する...

SQLと各種NoSQLデータベースの使用シナリオの説明

SQL はメイントランクです。なぜ私はこのように理解するのでしょうか。技術的な観点からリレーショナル...