L'utilisation de la fonction de fenêtre mysql

Fonction de fenêtre comme nouvelle fonction introduite par mysql8.0

Peut résoudre de nombreux problèmes liés au classement

Un, construire une table

create table  student(
id int ,
st_name  varchar(20),
score int,
date_time varchar(20),
primary key (id,date_time) 
);

Deux, insérez des données

insert  into student value(101,'张飞',62,'2017');
insert  into student value(101,'张飞',30,'2007');
insert  into student value(101,'张飞',82,'2020');
insert  into student value(101,'张飞',62,'2015');
insert  into student value(101,'张飞',62,'2019');
insert  into student value(102,'刘备',92,'2017');
insert  into student value(102,'刘备',72,'2010');
insert  into student value(102,'刘备',62,'2011');
insert  into student value(102,'刘备',98,'2020');
insert  into student value(103,'孙悟空',98,'2010');
insert  into student value(103,'孙悟空',98,'2011');
insert  into student value(103,'孙悟空',98,'2012');
insert  into student value(103,'孙悟空',97,'2013');
insert  into student value(103,'孙悟空',98,'2014');
insert  into student value(103,'孙悟空',99,'2015');
insert  into student value(103,'孙悟空',100,'2018');
insert  into student value(104,'哪吒',10,'2010');
insert  into student value(104,'哪吒',20,'2011');
insert  into student value(104,'哪吒',30,'2012');
insert  into student value(104,'哪吒',40,'2013');
insert  into student value(104,'哪吒',50,'2014');
insert  into student value(104,'哪吒',40,'2015');
insert  into student value(104,'哪吒',50,'2016');

Trois, fonction de fenêtre

Principalement divisé en 4 catégories:

Utilisation: fonction de fenêtre sur (partitionner en groupant l'ordre des champs par champ de tri)
(1) Fonction de numéro de séquence: rank (), dense_rank (), row_number ()

  • sélectionnez *, rank () over (partition par id ordre par score) comme classement de l'étudiant;
id, st_name, score, date_time, ranking
101, 张飞, 30, 2007, 1
101, 张飞, 62, 2015, 2
101, 张飞, 62, 2017, 2
101, 张飞, 62, 2019, 2
101, 张飞, 82, 2020, 5
102, 刘备, 62, 2011, 1
102, 刘备, 72, 2010, 2
102, 刘备, 92, 2017, 3
102, 刘备, 98, 2020, 4
103, 孙悟空, 97, 2013, 1
103, 孙悟空, 98, 2010, 2
103, 孙悟空, 98, 2011, 2
103, 孙悟空, 98, 2012, 2
103, 孙悟空, 98, 2014, 2
103, 孙悟空, 99, 2015, 6
103, 孙悟空, 100, 2018, 7
104, 哪吒, 10, 2010, 1
104, 哪吒, 20, 2011, 2
104, 哪吒, 30, 2012, 3
104, 哪吒, 40, 2013, 4
104, 哪吒, 40, 2015, 4
104, 哪吒, 50, 2014, 6
104, 哪吒, 50, 2016, 6

 

  • sélectionnez *, dense_rank () over (partition par id ordre par score) comme classement de l'étudiant;
id, st_name, score, date_time, ranking
101, 张飞, 30, 2007, 1
101, 张飞, 62, 2015, 2
101, 张飞, 62, 2017, 2
101, 张飞, 62, 2019, 2
101, 张飞, 82, 2020, 3
102, 刘备, 62, 2011, 1
102, 刘备, 72, 2010, 2
102, 刘备, 92, 2017, 3
102, 刘备, 98, 2020, 4
103, 孙悟空, 97, 2013, 1
103, 孙悟空, 98, 2010, 2
103, 孙悟空, 98, 2011, 2
103, 孙悟空, 98, 2012, 2
103, 孙悟空, 98, 2014, 2
103, 孙悟空, 99, 2015, 3
103, 孙悟空, 100, 2018, 4
104, 哪吒, 10, 2010, 1
104, 哪吒, 20, 2011, 2
104, 哪吒, 30, 2012, 3
104, 哪吒, 40, 2013, 4
104, 哪吒, 40, 2015, 4
104, 哪吒, 50, 2014, 5
104, 哪吒, 50, 2016, 5
  • sélectionnez *, row_number () over (partition par id ordre par score) comme classement de l'étudiant;
 id, st_name, score, date_time, ranking
101, 张飞, 30, 2007, 1
101, 张飞, 62, 2015, 2
101, 张飞, 62, 2017, 3
101, 张飞, 62, 2019, 4
101, 张飞, 82, 2020, 5
102, 刘备, 62, 2011, 1
102, 刘备, 72, 2010, 2
102, 刘备, 92, 2017, 3
102, 刘备, 98, 2020, 4
103, 孙悟空, 97, 2013, 1
103, 孙悟空, 98, 2010, 2
103, 孙悟空, 98, 2011, 3
103, 孙悟空, 98, 2012, 4
103, 孙悟空, 98, 2014, 5
103, 孙悟空, 99, 2015, 6
103, 孙悟空, 100, 2018, 7
104, 哪吒, 10, 2010, 1
104, 哪吒, 20, 2011, 2
104, 哪吒, 30, 2012, 3
104, 哪吒, 40, 2013, 4
104, 哪吒, 40, 2015, 5
104, 哪吒, 50, 2014, 6
104, 哪吒, 50, 2016, 7

En comparant les données ci-dessus, on constate que selon le classement effectué par score, lorsque le même score apparaît, les résultats de ces trois fonctions sont différents.

rang: il y a une situation où le rang est égal, le même rang occupe la valeur de rang, jusqu'à ce que la prochaine valeur différente apparaisse, la valeur augmente

dense_rank: Il y a une situation où le rang est égal, le même rang n'occupe pas la valeur de classement, jusqu'à ce que la prochaine valeur différente apparaisse, la valeur peut être augmentée de 1

row_number: Il n'y a pas de cas d'égalité, le classement peut augmenter dans l'ordre

(2) Fonction de distribution: percent_rank (), cume_dist ()

  • sélectionnez *, percent_rank () over (partition par id ordre par score) comme classement de l'étudiant;
id, st_name, score, date_time, ranking
101, 张飞, 30, 2007, 0
101, 张飞, 62, 2015, 0.25
101, 张飞, 62, 2017, 0.25
101, 张飞, 62, 2019, 0.25
101, 张飞, 82, 2020, 1
102, 刘备, 62, 2011, 0
102, 刘备, 72, 2010, 0.3333333333333333
102, 刘备, 92, 2017, 0.6666666666666666
102, 刘备, 98, 2020, 1
103, 孙悟空, 97, 2013, 0
103, 孙悟空, 98, 2010, 0.16666666666666666
103, 孙悟空, 98, 2011, 0.16666666666666666
103, 孙悟空, 98, 2012, 0.16666666666666666
103, 孙悟空, 98, 2014, 0.16666666666666666
103, 孙悟空, 99, 2015, 0.8333333333333334
103, 孙悟空, 100, 2018, 1
104, 哪吒, 10, 2010, 0
104, 哪吒, 20, 2011, 0.16666666666666666
104, 哪吒, 30, 2012, 0.3333333333333333
104, 哪吒, 40, 2013, 0.5
104, 哪吒, 40, 2015, 0.5
104, 哪吒, 50, 2014, 0.8333333333333334
104, 哪吒, 50, 2016, 0.8333333333333334

 Comment cette valeur est-elle calculée? La réponse est: (rang-1) / (rangées-1)

Rank est le rang calculé par la fonction rank (), et rows est le nombre de lignes

Par exemple, prenons Zhang Fei comme exemple

Rang = 1 dans la première ligne, donc la valeur est (1-1) / 4 = 0

Rang = 2 dans la deuxième ligne, donc la valeur est (2-1) /4=0.25

Rang = 2 dans la troisième ligne, donc la valeur est (2-1) /4=0.25

Rang = 2 dans la quatrième ligne, donc la valeur est (2-1) /4=0.25

Rang = 5 dans la cinquième ligne, donc la valeur est (5-1) / 4 = 1

  • sélectionnez *, cume_dist () over (partition par id ordre par score) comme classement de l'étudiant;
id, st_name, score, date_time, ranking
101, 张飞, 30, 2007, 0.2
101, 张飞, 62, 2015, 0.8
101, 张飞, 62, 2017, 0.8
101, 张飞, 62, 2019, 0.8
101, 张飞, 82, 2020, 1
102, 刘备, 62, 2011, 0.25
102, 刘备, 72, 2010, 0.5
102, 刘备, 92, 2017, 0.75
102, 刘备, 98, 2020, 1
103, 孙悟空, 97, 2013, 0.14285714285714285
103, 孙悟空, 98, 2010, 0.7142857142857143
103, 孙悟空, 98, 2011, 0.7142857142857143
103, 孙悟空, 98, 2012, 0.7142857142857143
103, 孙悟空, 98, 2014, 0.7142857142857143
103, 孙悟空, 99, 2015, 0.8571428571428571
103, 孙悟空, 100, 2018, 1
104, 哪吒, 10, 2010, 0.14285714285714285
104, 哪吒, 20, 2011, 0.2857142857142857
104, 哪吒, 30, 2012, 0.42857142857142855
104, 哪吒, 40, 2013, 0.7142857142857143
104, 哪吒, 40, 2015, 0.7142857142857143
104, 哪吒, 50, 2014, 1
104, 哪吒, 50, 2016, 1

 Comment cette valeur est-elle calculée? La réponse est: rank_rows / rows

rank_rows: le nombre de lignes dans le groupe qui sont inférieurs ou égaux à la valeur de classement actuelle / le nombre total de lignes dans le groupe

lignes: le nombre total de lignes dans le groupe

Prenons l'exemple de Zhang Fei

Dans la première ligne, rank_rows est égal à 1 et les lignes est égal à 5, donc le résultat est 0,2

Dans la deuxième ligne, rank_rows est égal à 4 et les lignes est égal à 5, donc le résultat est 0,8

Dans la troisième ligne, rank_rows est égal à 4 et les lignes est égal à 5, donc le résultat est 0,8

Dans la quatrième ligne, rank_rows est égal à 4 et les lignes est égal à 5, donc le résultat est 0,8

Dans la cinquième ligne, rank_rows est égal à 5 ​​et les lignes est égal à 5, donc le résultat est 1

(3) Fonctions avant et après: lag (), lead ()

  • sélectionnez *, lag (score, 1) over (partition par id, ordre par score) comme score de l'étudiant;
id, st_name, score, date_time, score
101, 张飞, 30, 2007, 
101, 张飞, 62, 2015, 30
101, 张飞, 62, 2017, 62
101, 张飞, 62, 2019, 62
101, 张飞, 82, 2020, 62
102, 刘备, 62, 2011, 
102, 刘备, 72, 2010, 62
102, 刘备, 92, 2017, 72
102, 刘备, 98, 2020, 92
103, 孙悟空, 97, 2013, 
103, 孙悟空, 98, 2010, 97
103, 孙悟空, 98, 2011, 98
103, 孙悟空, 98, 2012, 98
103, 孙悟空, 98, 2014, 98
103, 孙悟空, 99, 2015, 98
103, 孙悟空, 100, 2018, 99
104, 哪吒, 10, 2010, 
104, 哪吒, 20, 2011, 10
104, 哪吒, 30, 2012, 20
104, 哪吒, 40, 2013, 30
104, 哪吒, 40, 2015, 40
104, 哪吒, 50, 2014, 40
104, 哪吒, 50, 2016, 50
  • sélectionner *, diriger (score, 1) sur (partition par ID, ordre par score) comme score de l'élève;
id, st_name, score, date_time, score
101, 张飞, 30, 2007, 62
101, 张飞, 62, 2015, 62
101, 张飞, 62, 2017, 62
101, 张飞, 62, 2019, 82
101, 张飞, 82, 2020, 
102, 刘备, 62, 2011, 72
102, 刘备, 72, 2010, 92
102, 刘备, 92, 2017, 98
102, 刘备, 98, 2020, 
103, 孙悟空, 97, 2013, 98
103, 孙悟空, 98, 2010, 98
103, 孙悟空, 98, 2011, 98
103, 孙悟空, 98, 2012, 98
103, 孙悟空, 98, 2014, 99
103, 孙悟空, 99, 2015, 100
103, 孙悟空, 100, 2018, 
104, 哪吒, 10, 2010, 20
104, 哪吒, 20, 2011, 30
104, 哪吒, 30, 2012, 40
104, 哪吒, 40, 2013, 40
104, 哪吒, 40, 2015, 50
104, 哪吒, 50, 2014, 50
104, 哪吒, 50, 2016, 

(4) Fonctions de tête et de queue: first_value (), last_value ()

  • sélectionnez *, first_value (score) over (partition par id, ordre par score) comme score de l'étudiant;
id, st_name, score, date_time, score
101, 张飞, 30, 2007, 30
101, 张飞, 62, 2015, 30
101, 张飞, 62, 2017, 30
101, 张飞, 62, 2019, 30
101, 张飞, 82, 2020, 30
102, 刘备, 62, 2011, 62
102, 刘备, 72, 2010, 62
102, 刘备, 92, 2017, 62
102, 刘备, 98, 2020, 62
103, 孙悟空, 97, 2013, 97
103, 孙悟空, 98, 2010, 97
103, 孙悟空, 98, 2011, 97
103, 孙悟空, 98, 2012, 97
103, 孙悟空, 98, 2014, 97
103, 孙悟空, 99, 2015, 97
103, 孙悟空, 100, 2018, 97
104, 哪吒, 10, 2010, 10
104, 哪吒, 20, 2011, 10
104, 哪吒, 30, 2012, 10
104, 哪吒, 40, 2013, 10
104, 哪吒, 40, 2015, 10
104, 哪吒, 50, 2014, 10
104, 哪吒, 50, 2016, 10
  • sélectionnez *, last_value (score) over (partition par id, ordre par score) comme score de l'étudiant;
id, st_name, score, date_time, score
101, 张飞, 30, 2007, 30
101, 张飞, 62, 2015, 62
101, 张飞, 62, 2017, 62
101, 张飞, 62, 2019, 62
101, 张飞, 82, 2020, 82
102, 刘备, 62, 2011, 62
102, 刘备, 72, 2010, 72
102, 刘备, 92, 2017, 92
102, 刘备, 98, 2020, 98
103, 孙悟空, 97, 2013, 97
103, 孙悟空, 98, 2010, 98
103, 孙悟空, 98, 2011, 98
103, 孙悟空, 98, 2012, 98
103, 孙悟空, 98, 2014, 98
103, 孙悟空, 99, 2015, 99
103, 孙悟空, 100, 2018, 100
104, 哪吒, 10, 2010, 10
104, 哪吒, 20, 2011, 20
104, 哪吒, 30, 2012, 30
104, 哪吒, 40, 2013, 40
104, 哪吒, 40, 2015, 40
104, 哪吒, 50, 2014, 50
104, 哪吒, 50, 2016, 50

Référence: https://blog.csdn.net/weixin_39010770/article/details/87862407

Je suppose que tu aimes

Origine blog.csdn.net/zhou_438/article/details/108510339
conseillé
Classement