El uso de la función de ventana mysql

Función de ventana como una nueva función introducida por mysql8.0

Puede resolver muchos problemas relacionados con la clasificación.

Uno, construye una mesa

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

Dos, inserta datos

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');

Tres, función de ventana

Principalmente dividido en 4 categorías:

Uso: función de ventana sobre (partición por orden de campo de agrupación por campo de clasificación)
(1) Función de número de secuencia: rango (), rango_denso (), número de fila ()

  • seleccione *, rango () sobre (partición por identificación, orden por puntaje) como clasificación del estudiante;
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

 

  • seleccione *, dense_rank () over (partición por id, orden por puntuación) como clasificación del estudiante;
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
  • seleccione *, número_de_fila () sobre (partición por id, orden por puntuación) como clasificación del estudiante;
 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

Comparando los datos anteriores, se puede observar que según el ranking realizado por puntaje, cuando aparece el mismo puntaje, los resultados de estas tres funciones son diferentes.

rango: hay una situación en la que hay un empate, el mismo rango ocupa el valor de rango, hasta que aparece el siguiente valor diferente, el valor aumenta

dense_rank: hay una situación en la que hay un empate, el mismo rango no ocupa el valor de la clasificación, hasta que aparezca el siguiente valor diferente, el valor se puede aumentar en 1

row_number: No hay ningún caso en el que haya un empate, la clasificación puede aumentar en orden

(2) Función de distribución: percent_rank (), cume_dist ()

  • seleccione *, percent_rank () over (partición por id, orden por puntuación) como clasificación del estudiante;
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

 ¿Cómo se calcula este valor? La respuesta es: (rango-1) / (filas-1)

El rango es el rango calculado por la función rank () y las filas es el número de filas

Por ejemplo, tomemos a Zhang Fei como ejemplo

Rango = 1 en la primera fila, por lo que el valor es (1-1) / 4 = 0

Rango = 2 en la segunda fila, por lo que el valor es (2-1) /4=0.25

Rango = 2 en la tercera fila, por lo que el valor es (2-1) /4=0.25

Rango = 2 en la cuarta fila, por lo que el valor es (2-1) /4=0.25

Rango = 5 en la quinta fila, por lo que el valor es (5-1) / 4 = 1

  • seleccione *, cume_dist () over (partición por id, orden por puntuación) como clasificación del estudiante;
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

 ¿Cómo se calcula este valor? La respuesta es: rank_rows / rows

rank_rows: el número de filas en el grupo que son menores o iguales al valor de rango actual / el número total de filas en el grupo

filas: el número total de filas en el grupo

Tomemos a Zhang Fei como ejemplo

En la primera fila, rank_rows es igual a 1 y las filas son iguales a 5, por lo que el resultado es 0,2

En la segunda fila, rank_rows es igual a 4 y filas es igual a 5, por lo que el resultado es 0,8

En la tercera fila, rank_rows es igual a 4 y filas es igual a 5, por lo que el resultado es 0,8

En la cuarta fila, rank_rows es igual a 4 y filas es igual a 5, por lo que el resultado es 0,8

En la quinta fila, rank_rows es igual a 5 y las filas es igual a 5, por lo que el resultado es 1

(3) Funciones antes y después: lag (), lead ()

  • seleccione *, lag (puntuación, 1) sobre (partición por orden de identificación por puntuación) como puntuación del estudiante;
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
  • seleccione *, lidere (puntuación, 1) sobre (partición por orden de identificación por puntuación) como puntuación del estudiante;
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) Funciones de cabeza y cola: first_value (), last_value ()

  • seleccione *, first_value (puntuación) sobre (partición por ID, orden por puntuación) como puntuación del estudiante;
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
  • seleccione *, last_value (puntuación) sobre (partición por identificación, orden por puntuación) como puntuación del estudiante;
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

Referencia: https://blog.csdn.net/weixin_39010770/article/details/87862407

Supongo que te gusta

Origin blog.csdn.net/zhou_438/article/details/108510339
Recomendado
Clasificación