MySQL-MySQL 8.0(3)ステップアップ操作:ウィンドウ関数

8059 ワード

文書ディレクトリ
  • 準備
  • 構文
  • この学习文はMySQL 8.0に基づいて书いた大神の友达の心のこもった指导のおかげで多くの穴を解决して、やっとこの文を书いて、大神に膝を捧げます
     クエリー内の各ローについて、ウィンドウ関数を使用して、そのローに関連するローを使用して計算を実行できます.これは、OVER句およびWINDOW句を使用することによって達成される.  以下は計算を実行できる関数です.
  • ROW_NUMBER():パーティション内の現在のローの番号.
  • RANK():パーティション内の現在のローのレベル(間隔あり).
  • DENSE_RANK():パーティション内の現在のローのレベル(間隔なし).
  • PERCENT_RANK():パーセントランキング値.
  • FIRST_VALUE():ウィンドウフレームの最初の行のパラメータ値.
  • LAST_VALUE():ウィンドウフレームの最後行のパラメータ値.
  • LEAD():パーティション内の現在のローのローのパラメータ値を先頭にします.
  • LAG():パーティション内の現在のローのパラメータ値に遅れています.
  • NTH_VALUE():ウィンドウフレームのn行目のパラメータ値.
  • NTILE():パーティション内の現在の行のバケツの番号.
  • COME_DIST():分布値を累積します.

  • 準備作業
    例を有効にするには、まずhire_date_year、full_name仮想列参照:MySQL-MySQL 8.0ステップアクション:生成列(generated column)を追加します.
    #      
    mysql> alter table employees.employees add hire_date_year year as (year(hire_date)) virtual;
    Query OK, 0 rows affected (0.21 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> alter table employees.employees add full_name varchar(30) as (concat(first_name, ' ', last_name)) virtual;
    Query OK, 0 rows affected (0.12 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc employees.employees;
    +----------------+---------------+------+-----+---------+-------------------+
    | Field          | Type          | Null | Key | Default | Extra             |
    +----------------+---------------+------+-----+---------+-------------------+
    | emp_no         | int(11)       | NO   | PRI | NULL    |                   |
    | birth_date     | date          | NO   |     | NULL    |                   |
    | first_name     | varchar(14)   | NO   |     | NULL    |                   |
    | last_name      | varchar(16)   | NO   |     | NULL    |                   |
    | gender         | enum('M','F') | NO   |     | NULL    |                   |
    | hire_date      | date          | NO   |     | NULL    |                   |
    | hire_date_year | year(4)       | YES  |     | NULL    | VIRTUAL GENERATED |
    | full_name      | varchar(30)   | YES  |     | NULL    | VIRTUAL GENERATED |
    +----------------+---------------+------+-----+---------+-------------------+
    8 rows in set (0.00 sec)
    

    構文
    結果はOVER句で分割できます
  • partition by:パケット
  • order by:ソート
  • mysql> select full_name, 
        -> gender, 
        -> row_number()over(partition by gender order by hire_date_year asc) rn  
        -> from employees.employees 
        -> limit 3;
    +-----------------------+--------+----+
    | full_name             | gender | rn |
    +-----------------------+--------+----+
    | Shen Peternell        | M      |  1 |
    | Shigehito Uhrig       | M      |  2 |
    | Sivanarayana Dymetman | M      |  3 |
    +-----------------------+--------+----+
    3 rows in set (0.32 sec)
    

    詳細は以下を参照してください.https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html