上位 3 つはほぼ予想どおりで、次のとおりです。 1. カーソル 2. ウィンドウ関数 3. クラスター化インデックス これら3つのポイントは日常生活ではあまり使われませんが、 今日はウィンドウ関数についてお話ししたいと思います。MySQL さて、前置きはこれくらいにして、いつものように前菜から始めて、今日のテスト テーブル データを見てみましょう。 この記事のデモンストレーションに使用されているテスト テーブルは mysql> chh_baozipu から * を選択します。 +----+--------------------+-------+---------+ | ID | 製品 | 売上 | 月 | +----+--------------------+-------+---------+ | 1 | 豚肉とネギのパン | 600 | 2021-11 | | 2 | 豚肉とネギのパン | 1600 | 2021-10 | | 3 | 豚肉とネギのパン | 1000 | 2021-09 | | 4 | 豚肉とネギのパン | 800 | 2021-08 | | 5 | 豚肉とネギのパン | 1600 | 2021-07 | | 6 | 豚肉とネギのパン | 1000 | 2021-06 | | 7 | 小麦パン | 700 | 2021-11 | | 8 | 小麦パン | 200 | 2021-10 | | 9 | 小麦パン | 300 | 2021-09 | | 10 | 小麦パン | 0 | 2021-08 | | 11 | 小麦パン | 100 | 2021-07 | | 12 | 小麦パン | 200 | 2021-06 | +----+--------------------+-------+---------+ セット内の行数は 12 です (0.00 秒) なんと言えばいいでしょうか?いつか私の店に来てください。小麦を詰めたパンを皆さんにご馳走します。 1. ウィンドウ関数とは何ですか?1. ウィンドウをどのように理解しますか?実際、 テストテーブルを例にして、 SELECT *,SUM(sales) over(ORDER BY `month`) as 累積利益 from chh_baozipu where product='豚肉とネギの饅頭'; mysql> SELECT *,SUM(sales) over(ORDER BY `month`) as 累積利益 from chh_baozipu where product='豚肉とネギの饅頭'; +----+--------------------+-------+---------+--------------+ | ID | 製品 | 売上 | 月 | 累計利益| +----+--------------------+-------+---------+--------------+ | 6 | 豚肉とネギのパン | 1000 | 2021-06 | 1000 | | 5 | 豚肉とネギのパン | 1600 | 2021-07 | 2600 | | 4 | 豚肉とネギのパン | 800 | 2021-08 | 3400 | | 3 | 豚肉とネギのパン | 1000 | 2021-09 | 4400 | | 2 | 豚肉とネギのパン | 1600 | 2021-10 | 6000 | | 1 | 豚肉とネギのパン | 600 | 2021-11 | 6600 | +----+--------------------+-------+---------+--------------+ セット内の 6 行 (0.00 秒) この SQL ステートメントから、id=6 の最初の行の
各レコードについて、このウィンドウ内で関数を実行する必要があります。一部の関数では、ウィンドウのサイズはレコードに応じて固定されており、 2. ウィンドウ関数とは何ですか?
ウィンドウ関数はどのようなシナリオで主に使用されますか?主なカテゴリは 2 つあります。
一般的なウィンドウ関数と集計関数は次のとおりです。
集計関数はウィンドウ関数でも使用できるため、ウィンドウ関数と通常の集計関数は混同されやすいです。 両者の違いは次のとおりです。
2. ウィンドウ関数の使用基本的な構文: <ウィンドウ関数> OVER (PARTITION BY <グループ化する列名> ORDER BY <並べ替える列名>); -- over キーワードは、関数のウィンドウ範囲を指定するために使用されます。 --partition by はテーブルをグループ化するために使用されます。 -- order by 句は、グループ化された結果を並べ替えるために使用されます。
ウィンドウ関数とは何ですか?描くのが面倒なので
いくつかの例を見てみましょう: 1. 順序関数: row_number() / rank() / dense_rank()ROW_NUMBER(): 順次ソート - 1、2、3 RANK(): 重複する数字をスキップして並列にソートします - 1、1、3 DENSE_RANK(): 重複する数字をスキップせずに並列ソート - 1、1、2 mysql> SELECT *,ROW_NUMBER() over(ORDER BY sales desc) as pro_ROW_NUMBER,rank() over(ORDER BY sales desc) as pro_rank,DENSE_RANK() over(ORDER BY sales desc) as pro_DENSE_RANK from chh_baozipu where product='Pork and Scallion Buns'; +----+--------------------+-------+---------+----------------+----------+----------------+ | id | 製品 | 売上 | 月 | pro_ROW_NUMBER | pro_rank | pro_DENSE_RANK | +----+--------------------+-------+---------+----------------+----------+----------------+ | 2 | 豚肉とネギのパン | 1600 | 2021-10 | 1 | 1 | 1 | | 5 | 豚肉とネギのパン | 1600 | 2021-07 | 2 | 1 | 1 | | 3 | 豚肉とネギのパン | 1000 | 2021-09 | 3 | 3 | 2 | | 6 | 豚肉とネギのパン | 1000 | 2021-06 | 4 | 3 | 2 | | 4 | 豚肉とネギのパン | 800 | 2021-08 | 5 | 5 | 3 | | 1 | 豚肉とネギのパン | 600 | 2021-11 | 6 | 6 | 4 | +----+--------------------+-------+---------+----------------+----------+----------------+ セット内の 6 行 (0.00 秒) 上記の例からわかるように、3 つのウィンドウ関数は 3 つの異なる一般的なビジネス ニーズに対応しており、ソート統計を処理するには十分です。 今後、面接や筆記試験で学生に質問されたときは、自己クエリネストなどの低レベルのソリューションについて話さないでください。そうしないと、私のことを知っているとは言わないでください〜犬 2. 分布関数: percent_rank() / cume_dist()この分配関数は基本的に使用されない関数なので、ここでは説明しません。興味のある学生は自分でBaiduで検索してみてください〜 3. 関数の前後: lag(expr,n) / lead(expr,n)
before 関数と after 関数は、現在の行の アプリケーションシナリオ: 上位n人の生徒のスコアと現在の生徒のスコアの差を照会する 内部 SQL は最初に LAG() 関数を使用して前の生徒のスコアを取得し、次に外部 SQL は現在の生徒と前の生徒のスコアを減算してスコアの差 diff を取得します。 ここで Ha Ge のテスト テーブルを使用するのは少し不便です。 。しかし、私の言っている意味は間違いなく分かるでしょう。確認してみましょう。 mysql> SELECT *,lag(sales,1) over win as pro_lag,lead(sales,1) over win as pro_lead from chh_baozipu WINDOW win as (PARTITION BY product ORDER BY sales desc); +----+--------------------+--------+---------+----------+----------+ | id | 製品 | 売上 | 月 | pro_lag | pro_lead | +----+--------------------+--------+---------+----------+----------+ | 2 | 豚肉とネギのパン | 1600 | 2021-10 | NULL | 1600 | | 5 | 豚肉とネギのパン | 1600 | 2021-07 | 1600 | 1000 | | 3 | 豚肉とネギのパン | 1000 | 2021-09 | 1600 | 1000 | | 6 | 豚肉とネギのパン | 1000 | 2021-06 | 1000 | 800 | | 4 | 豚肉とネギのパン | 800 | 2021-08 | 1000 | 600 | | 1 | 豚肉とネギのパン | 600 | 2021-11 | 800 | NULL | | 7 | 小麦パン | 700 | 2021-11 | NULL | 300 | | 9 | 小麦パン | 300 | 2021-09 | 700 | 200 | | 8 | 小麦パン | 200 | 2021-10 | 300 | 200 | | 12 | 小麦パン | 200 | 2021-06 | 200 | 100 | | 11 | 小麦パン | 100 | 2021-07 | 200 | 0 | | 10 | 小麦パン | 0 | 2021-08 | 100 | NULL | +----+--------------------+--------+---------+----------+----------+ セット内の行数は 12 です (0.00 秒) ここで、この SQL が前の SQL と異なることに気づいたかどうかを学生に尋ねたいと思います。違いは何ですか? *を選択、 lag(sales,1) は pro_lag として win を超えます。 pro_lead として、lead(sales,1) が win を上回る chh_baozipu より、product='豚肉とネギのパン' WINDOW win as (PARTITION BY product ORDER BY sales desc); 1. 実際、このメソッドはウィンドウを表示し、SQL を記述するときにエイリアスを使用するのと同じように、 誰かがプログラマーに、どんなシンプルさが欲しいかと尋ねました。他の人があなたのコードを理解できなくても、それは素晴らしいと思うでしょう。このような学生は社会に打ち負かされたことがないのは明らかです。百年に一度現れる先祖の規範に遭遇すると、シンプルさが何であるかがわかります(Fat Brotherから画像を借りています)。 2. ウィンドウに over 句のこのキーワードは、ウィンドウの内容を制御することを意味します。上記の基本構文では、over に 2 つのキーワードがあることを説明しました。
実は、ウィンドウの範囲を制御するもっと面白い方法があるんです~~
BETWEEN frame_start AND frame_end 構文は通常、行の範囲を示すために使用されます。frame_start と frame_end は、異なる動的行レコードを識別するために次のキーワードをサポートできます。
いくつかの例を見てみましょう。 ①現在の行と前のn行(合計n+1行)の集計ウィンドウ関数を計算する 次の例では、コントロール ウィンドウのサイズは、現在の月の利益と過去 2 か月の利益の合計です。効果を見てみましょう。 SELECT *,SUM(sales) OVER win を「過去 3 か月の利益の合計」として選択します。 chh_baozipuより WINDOW win as (PARTITION BY product ORDER BY `month` ROWS 2 PRECEDING); mysql> SELECT *,SUM(sales) OVER win を「過去3か月間の利益の合計」として選択します。 -> chh_baozipu より -> WINDOW win as (PARTITION BY product ORDER BY `month` ROWS 2 PRECEDING); +----+--------------------+-------+---------+--------------------------+ | ID | 製品 | 売上 | 月 | 過去 3 か月の合計利益 | +----+--------------------+-------+---------+--------------------------+ | 6 | 豚肉とネギのパン | 1000 | 2021-06 | 1000 | | 5 | 豚肉とネギのパン | 1600 | 2021-07 | 2600 | | 4 | 豚肉とネギのパン | 800 | 2021-08 | 3400 | | 3 | 豚肉とネギのパン | 1000 | 2021-09 | 3400 | | 2 | 豚肉とネギのパン | 1600 | 2021-10 | 3400 | | 1 | 豚肉とネギのパン | 600 | 2021-11 | 3200 | | 12 | 小麦パン | 200 | 2021-06 | 200 | | 11 | 小麦パン | 100 | 2021-07 | 300 | | 10 | 小麦パン | 0 | 2021-08 | 300 | | 9 | 小麦パン | 300 | 2021-09 | 400 | | 8 | 小麦パン | 200 | 2021-10 | 500 | | 7 | 小麦パン | 700 | 2021-11 | 1200 | +----+--------------------+-------+---------+--------------------------+ セット内の行数は 12 です (0.00 秒) ②現在の行、最初のn1行、最後のn2行の集計ウィンドウ関数を計算する 次の例では、コントロール ウィンドウのサイズは、現在の月の前月と翌月の利益の合計です。効果を見てみましょう。 SELECT *,SUM(sales) OVER win を「最初の 3 か月間の利益の合計」として選択します。 chh_baozipuより WINDOW win as (PARTITION BY product ORDER BY `month` ROWS BETWEEN n1 PRECEDING AND n2 FOLLOWING); mysql> SELECT *,SUM(sales) OVER win as '前月から翌月までの利益の合計' FROM chh_baozipu WINDOW win as (PARTITION BY product ORDER BY `month` ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING); +----+--------------------+-------+---------+--------------------------+ | id | 製品 | 売上 | 月 | 前月から翌月までの利益の合計| +----+--------------------+-------+---------+--------------------------+ | 6 | 豚肉とネギのパン | 1000 | 2021-06 | 2600 | | 5 | 豚肉とネギのパン | 1600 | 2021-07 | 3400 | | 4 | 豚肉とネギのパン | 800 | 2021-08 | 3400 | | 3 | 豚肉とネギのパン | 1000 | 2021-09 | 3400 | | 2 | 豚肉とネギのパン | 1600 | 2021-10 | 3200 | | 1 | 豚肉とネギのパン | 600 | 2021-11 | 2200 | | 12 | 小麦パン | 200 | 2021-06 | 300 | | 11 | 小麦パン | 100 | 2021-07 | 300 | | 10 | 小麦パン | 0 | 2021-08 | 400 | | 9 | 小麦パン | 300 | 2021-09 | 500 | | 8 | 小麦パン | 200 | 2021-10 | 1200 | | 7 | 小麦パン | 700 | 2021-11 | 900 | +----+--------------------+-------+---------+--------------------------+ セット内の行数は 12 です (0.00 秒) 4. 先頭関数と末尾関数: FIRST_VALUE(expr)、LAST_VALUE(expr)head 関数と tail 関数は、expr の最初の値または最後の値を返すために使用されます。 アプリケーションシナリオ: 現在、日付の並べ替えによって *を選択、 FIRST_VALUE(売上)を「現在の最大月収」として勝ち越す、 LAST_VALUE(売上) を「現在の最低月収」として勝ち越す chh_baozipuより WINDOW win as (PARTITION BY product ORDER BY `month`); mysql> SELECT *、FIRST_VALUE(sales) over win as '現在の最大月収'、LAST_VALUE(sales) over win as '現在の最小月収' from chh_baozipu WINDOW win as (PARTITION BY product ORDER BY `month`); +----+--------------------+--------+---------+------------------------+------------------------+ | ID | 製品 | 売上 | 月 | 現在の最高月収 | 現在の最低月収 | +----+--------------------+--------+---------+------------------------+------------------------+ | 6 | 豚肉とネギのパン | 1000 | 2021-06 | 1000 | 1000 | | 5 | 豚肉とネギのパン | 1600 | 2021-07 | 1000 | 1600 | | 4 | 豚肉とネギのパン | 800 | 2021-08 | 1000 | 800 | | 3 | 豚肉とネギのパン | 1000 | 2021-09 | 1000 | 1000 | | 2 | 豚肉とネギのパン | 1600 | 2021-10 | 1000 | 1600 | | 1 | 豚肉とネギのパン | 600 | 2021-11 | 1000 | 600 | | 12 | 小麦パン | 200 | 2021-06 | 200 | 200 | | 11 | 小麦パン | 100 | 2021-07 | 200 | 100 | | 10 | 小麦パン | 0 | 2021-08 | 200 | 0 | | 9 | 小麦パン | 300 | 2021-09 | 200 | 300 | | 8 | 小麦パン | 200 | 2021-10 | 200 | 200 | | 7 | 小麦パン | 700 | 2021-11 | 200 | 700 | +----+--------------------+--------+---------+------------------------+------------------------+ セット内の行数は 12 です (0.00 秒) 5. その他の関数: nth_value() / nfile() nfile() は一般的に使用されないため、ここでは詳細には触れません。ここでは NTH_VALUE 目的: ウィンドウ内の n 番目の expr の値を返します。 応用シナリオ:現在、陳哈哈饅頭店の月間利益ランキングの2位と3位の利益が表示されています。 *を選択、 nth_value(sales,2) が「現在2番目に高い月収」として勝ち越し、 nth_value(sales,3) が「現在月収第3位」として勝利 chh_baozipuより WINDOW win as (PARTITION BY product ORDER BY `month`); mysql> SELECT *,nth_value(sales,2) over win as '現在月収2位',nth_value(sales,3) over win as '現在月収3位' from chh_baozipu WINDOW win as (PARTITION BY product ORDER BY `month`); +----+--------------------+-------+---------+--------------------------------+--------------------------------+ | id | 製品 | 売上 | 月 | 現在の月収第2位 | 現在の月収第3位 | +----+--------------------+-------+---------+--------------------------------+--------------------------------+ | 6 | 豚肉とネギのパン | 1000 | 2021-06 | NULL | NULL | | 5 | 豚肉とネギのパン | 1600 | 2021-07 | 1600 | NULL | | 4 | 豚肉とネギのパン | 800 | 2021-08 | 1600 | 800 | | 3 | 豚肉とネギのパン | 1000 | 2021-09 | 1600 | 800 | | 2 | 豚肉とネギのパン | 1600 | 2021-10 | 1600 | 800 | | 1 | 豚肉とネギのパン | 600 | 2021-11 | 1600 | 800 | | 12 | 小麦パン | 200 | 2021-06 | NULL | NULL | | 11 | 小麦パン | 100 | 2021-07 | 100 | NULL | | 10 | 小麦パン | 0 | 2021-08 | 100 | 0 | | 9 | 小麦パン | 300 | 2021-09 | 100 | 0 | | 8 | 小麦パン | 200 | 2021-10 | 100 | 0 | | 7 | 小麦パン | 700 | 2021-11 | 100 | 0 | +----+--------------------+-------+---------+--------------------------------+--------------------------------+ セット内の行数は 12 です (0.00 秒) 章の要約ウィンドウ関数について私が言いたいことはこれだけです。ウィンドウ関数は、MySQL 8 に触れてから私が発見した新しいものです。突然、MySQL 開発チームがまだ非常に創造的であると感じました。各バージョンでは、もちろん非常に実用的な新しい遊び方が追加されています。MySQL 9.0 が私たちにさらなる驚きをもたらしてくれることを期待しています。 MySQL ウィンドウ関数の具体的な使い方については、これで終わりです。MySQL ウィンドウ関数に関するより詳しい内容については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Vue+ElementUI はページング関数を実装します - mysql データ
>>: クラウドサーバーはBaotaを使用してPython環境を構築し、Djangoプログラムを実行します。
SQL JOIN 句は、テーブル間の共通フィールドに基づいて 2 つ以上のテーブルの行を結合するため...
目次1. フロントエンドルーティングの実装原則2. vue-Routerの基本的な使い方2.1. イ...
HTML と CSS で実装された登録ページ テンプレート。早速、コードを見てみましょう。更新: ...
最近、業務上のボタンの増加により、ページレイアウトにボタンが多すぎて、ページが美しくなく、ユーザーエ...
かなりの数のウェブサイトがデジタルページング効果を使用しています。たとえば、このサイトのページングも...
現在実装されているのは、基本的な使用方法、クリア可能なボックス、パスワードボックスです。参考リンク:...
この記事では、具体的な例を使用して、CentOS 7 から CentOS 8 にアップグレードする方...
目次先読みと後読みをキャプチャグループと組み合わせる捕獲グループと非捕獲グループ前を向いて、後ろを振...
この記事はWindows 10のシステム環境をベースに、Reactの学習と使用について説明しています...
NFSが提供するサービスマウント: サーバー上で /usr/sbin/rpc.mountd サーボ ...
DockerにNginxをインストールするNginx は、IMAP/POP3/SMTP サービスも提...
テーブルを作成テーブルテーブル名を作成create table if not exists 表名 m...
目次ミックスインの実装フック関数のマージプロジェクト実践伸ばす要約するVue は mixins AP...
イギリスBFC: ブロック書式設定コンテキストBFCレイアウトルール内箱は縦方向に次々に配置されます...
進捗バーがスムーズではないフロントエンドを学ぶ学生のほとんどは、オーディオプレーヤーやビデオプレーヤ...