Heim > Datenbank > MySQL-Tutorial > Hauptteil

MySQL实现Oracle或者PostgreSQL的row_numberover这样的排名语法_MySQL

WBOY
Freigeben: 2016-06-01 13:26:14
Original
1450 Leute haben es durchsucht

bitsCN.com PostgreSQL 和Oracle 都提供了 row_number() over() 这样的语句来进行对应的字段排名, 很是方便。 MySQL却没有提供这样的语法。
Table "ytt.t1" Column | Type | Modifiers --------+-----------------------+----------- i_name | character varying(10) | not null rank | integer | not null

t_girl=# select * from t1 order by i_name; i_name | rank ---------+------ Charlie | 12 Charlie | 12 Charlie | 13 Charlie | 10 Charlie | 11 Lily | 6 Lily | 7 Lily | 7 Lily | 6 Lily | 5 Lily | 7 Lily | 4 Lucy | 1 Lucy | 2 Lucy | 2 Ytt | 14 Ytt | 15 Ytt | 14 Ytt | 14 Ytt | 15 (20 rows)
Nach dem Login kopieren
t_girl=# select i_name,rank, row_number() over(partition by i_name order by rank desc) as rank_number from t1; i_name | rank | rank_number ---------+------+------------- Charlie | 13 | 1 Charlie | 12 | 2 Charlie | 12 | 3 Charlie | 11 | 4 Charlie | 10 | 5 Lily | 7 | 1 Lily | 7 | 2 Lily | 7 | 3 Lily | 6 | 4 Lily | 6 | 5 Lily | 5 | 6 Lily | 4 | 7 Lucy | 2 | 1 Lucy | 2 | 2 Lucy | 1 | 3 Ytt | 15 | 1 Ytt | 15 | 2 Ytt | 14 | 3 Ytt | 14 | 4 Ytt | 14 | 5 (20 rows)
Nach dem Login kopieren
Nach dem Login kopieren


 

t_girl=# select i_name,rank, row_number() over(partition by i_name ) as rank_number from t1; i_name  | rank | rank_number ---------+------+------------- Charlie	 |   12 |           1 Charlie	|   12 |           2 Charlie	|   13 |           3 Charlie	|   10 |           4 Charlie	|   11 |           5 Lily		|    6 |           1 Lily		|    7 |           2 Lily		|    7 |           3 Lily		|    6 |           4 Lily		|    5 |           5 Lily		|    7 |           6 Lily		|    4 |           7 Lucy	|    1 |           1 Lucy	|    2 |           2 Lucy	|    2 |           3 Ytt		|   14 |           1 Ytt		|   15 |           2 Ytt		|   14 |           3 Ytt		|   14 |           4 Ytt		|   15 |           5(20 rows)
Nach dem Login kopieren



t_girl=# select i_name,rank, row_number() over() as rank_number from t1; i_name  | rank | rank_number ---------+------+------------- Lily		 |    7 |           1 Lucy	|    2 |           2 Ytt		|   14 |           3 Ytt		|   14 |           4 Charlie	|   12 |           5 Charlie	|   13 |           6 Lily		|    7 |           7 Lily		|    4 |           8 Ytt		|   14 |           9 Lily		|    6 |          10 Lucy	|    1 |          11 Lily		|    7 |          12 Ytt		|   15 |          13 Lily		|    6 |          14 Charlie	|   11 |          15 Charlie	|   12 |          16 Lucy	|    2 |          17 Charlie	|   10 |          18 Lily		|    5 |          19 Ytt		|   15 |          20(20 rows)
Nach dem Login kopieren


DELIMITER $$ USE `t_girl`$$ DROP PROCEDURE IF EXISTS `sp_rownumber`$$ CREATE PROCEDURE `sp_rownumber`( IN f_table_name VARCHAR(64), IN f_column_partitionby VARCHAR(64), IN f_column_orderby VARCHAR(64), IN f_is_asc CHAR(4) ) BEGIN -- Created by ytt at 2014/1/10 -- Do a row_number() over() DECLARE i INT; -- Create a temporary table to save result. DROP TABLE IF EXISTS tmp_rownum; SET @stmt = CONCAT('create temporary table tmp_rownum select *,''rownum'' from ',f_table_name,' where 1 = 0'); PREPARE s1 FROM @stmt; EXECUTE s1; SET i = 0; SET @j = 0; SET @v_column_paritionby = ''; -- Check whether parition column is null or not. IF (f_column_partitionby = '' OR f_column_partitionby IS NULL) THEN -- No additional parition column. SET @stmt = CONCAT('insert into tmp_rownum select *,@j:= @j+1 as rownum from ', f_table_name); PREPARE s1 FROM @stmt; EXECUTE s1; ELSE -- Give partition column. SET @stmt = CONCAT('select count(*) from (select count(*) from ',f_table_name,' group by ', f_column_partitionby,') as a into @cnt'); PREPARE s1 FROM @stmt; EXECUTE s1; WHILE i < @cnt DO -- Get the partition value one by one. SET @stmt = CONCAT('select ',f_column_partitionby,' from ',f_table_name,' group by ',f_column_partitionby,' limit ',i,',1 into @v_column_partitionby'); PREPARE s1 FROM @stmt; EXECUTE s1; -- Check whether sort is needed. IF f_column_orderby = '' OR f_column_orderby IS NULL THEN SET @stmt = CONCAT('insert into tmp_rownum select *,@j:= @j+1 as rownum from ', f_table_name,' where ',f_column_partitionby,' = ''',@v_column_partitionby,''''); ELSE SET @stmt = CONCAT('insert into tmp_rownum select *,@j:= @j+1 as rownum from ', f_table_name,' where ',f_column_partitionby,' = ''',@v_column_partitionby,''' order by ',f_column_orderby,' ',f_is_asc); END IF; SET @j = 0; PREPARE s1 FROM @stmt; EXECUTE s1; SET i = i + 1; END WHILE; END IF; -- Reset all session variables. SET @j = NULL; SET @v_column_paritionby = NULL; SET @cnt = NULL; SELECT * FROM tmp_rownum; END$$ DELIMITER ;
Nach dem Login kopieren
Nach dem Login kopieren


CALL sp_rownumber(&#39;t1&#39;,&#39;i_name&#39;,&#39;rank&#39;,&#39;desc&#39;);query resulti_name	rank	rownumCharlie	13	1Charlie	12	2Charlie	12	3Charlie	11	4Charlie	10	5Lily		7	1Lily		7	2Lily		7	3Lily		6	4Lily		6	5Lily		5	6Lily		4	7Lucy	2	1Lucy	2	2Lucy	1	3Ytt		15	1Ytt		15	2Ytt		14	3Ytt		14	4Ytt		14	5
Nach dem Login kopieren

第二种,

CALL sp_rownumber(&#39;t1&#39;,&#39;i_name&#39;,NULL,NULL);query resulti_name	rank	rownumCharlie	12	1Charlie	13	2Charlie	11	3Charlie	12	4Charlie	10	5Lily		7	1Lily		7	2Lily		4	3Lily		6	4Lily		7	5Lily		6	6Lily		5	7Lucy	2	1Lucy	1	2Lucy	2	3Ytt		14	1Ytt		14	2Ytt		14	3Ytt		15	4Ytt		15	5
Nach dem Login kopieren

第三种,

CALL sp_rownumber(&#39;t1&#39;,NULL,NULL,NULL);query resulti_name	rank	rownumLily		7	1Lucy	2	2Ytt		14	3Ytt		14	4Charlie	12	5Charlie	13	6Lily		7	7Lily		4	8Ytt		14	9Lily		6	10Lucy	1	11Lily		7	12Ytt		15	13Lily		6	14Charlie	11	15Charlie	12	16Lucy	2	17Charlie	10	18Lily		5	19Ytt		15	20
Nach dem Login kopieren

 


 

bitsCN.com
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage