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