MYSQL 存储过程实现类似ORACLE row_number 和 rank 的简单例子

row_number 实现:

DELIMITER $$


USE `zhangzm`$$


DROP PROCEDURE IF EXISTS `row_number`$$


CREATE DEFINER=`root`@`%` PROCEDURE `row_number`()
BEGIN
  DECLARE rn INT DEFAULT 0 ;
  DECLARE _StuId VARCHAR (5) ;
  DECLARE _CourseId VARCHAR (3) ;
  DECLARE _Score FLOAT ;
  DECLARE last_CourseId VARCHAR (3) ;
  DECLARE done TINYINT DEFAULT FALSE ;
  DECLARE cur CURSOR FOR 
  SELECT 
    `StuId`,
    `CourseId`,
    `Score` 
  FROM
    `zhangzm`.`tblScore` 
  ORDER BY `CourseId`,
    `Score` DESC ;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE ;
  DROP TABLE IF EXISTS temp_tblScore ;
  CREATE TEMPORARY TABLE temp_tblScore LIKE `zhangzm`.`tblScore` ;
  ALTER TABLE temp_tblScore 
    ADD COLUMN row_number INT UNSIGNED NOT NULL ;
  OPEN cur ;
  WHILE
    done <=> FALSE DO FETCH cur INTO _StuId,
    _CourseId,
    _Score ;
    IF _CourseId <> last_CourseId 
    THEN SET rn = 1 ;
    ELSE SET rn = rn + 1 ;
    END IF ;
    IF rn < 4 
    THEN 
    INSERT INTO temp_tblScore 
    SELECT 
      _StuId,
      _CourseId,
      _Score,
      rn ;
    END IF ;
    SET last_CourseId = _CourseId ;
  END WHILE ;
  SELECT 
    * 
  FROM
    temp_tblScore ;
  CLOSE cur ;
  DROP TABLE IF EXISTS temp_tblScore ;
END$$


DELIMITER ;



rank实现:

DELIMITER $$


USE `zhangzm`$$


DROP PROCEDURE IF EXISTS `rank`$$


CREATE DEFINER=`root`@`%` PROCEDURE `rank`()
BEGIN
  DECLARE rn INT DEFAULT 1 ;
  DECLARE _StuId VARCHAR (5) ;
  DECLARE _CourseId VARCHAR (3) ;
  DECLARE _Score FLOAT ;
  DECLARE last_CourseId VARCHAR (3) ;
  DECLARE last_Score FLOAT ;
  DECLARE done TINYINT DEFAULT FALSE ;
  DECLARE cur CURSOR FOR 
  SELECT 
    `StuId`,
    `CourseId`,
    `Score` 
  FROM
    `zhangzm`.`tblScore` 
  ORDER BY `CourseId`,
    `Score` DESC ;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE ;
  DROP TABLE IF EXISTS temp_tblScore ;
  CREATE TEMPORARY TABLE temp_tblScore LIKE `zhangzm`.`tblScore` ;
  ALTER TABLE temp_tblScore 
    ADD COLUMN row_number INT UNSIGNED NOT NULL ;
  OPEN cur ;
  WHILE
    done <=> FALSE DO FETCH cur INTO _StuId,
    _CourseId,
    _Score ;
    IF _CourseId <> last_CourseId 
    THEN SET rn = 1 ;
    ELSEIF _Score <> last_Score 
    THEN SET rn = rn + 1 ;
    END IF ;
    IF rn < 4 
    THEN 
    INSERT INTO temp_tblScore 
    SELECT 
      _StuId,
      _CourseId,
      _Score,
      rn ;
    END IF ;
    SET last_CourseId = _CourseId ;
    SET last_Score = _Score ;
  END WHILE ;
  SELECT 
    * 
  FROM
    temp_tblScore ;
  CLOSE cur ;
  DROP TABLE IF EXISTS temp_tblScore ;
END$$


DELIMITER ;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值