php和mysql仿excel的rank函数

php仿excel的rank函数也是借鉴网上的代码,但是没有二维数组情况下的进行rank排名,所以自己对代码稍微改了一下,可以直接运行试验。

<?php
$arr = array(
          array(‘s‘=>‘99‘,‘r‘=>‘1‘,‘a‘=>‘a‘),
          array(‘s‘=>‘99‘,‘r‘=>‘1‘,‘b‘=>‘b‘),
          array(‘s‘=>‘100‘,‘r‘=>‘2‘,‘c‘=>‘c‘),
          array(‘s‘=>‘101‘,‘r‘=>‘3‘,‘d‘=>‘d‘)
        );

echo ‘<pre>‘;
print_r(rank($arr,‘s‘,‘r‘));

//获得一组数的名次的数组
function rank(array $array,$s,$r){
        foreach($array as $k=>$v){
          $marr[] = $v[$s];
        }
        foreach($array as $val){
          $repeat=get_array_repeats($val[$s],$marr);
          $num=gt_array_values($val[$s],$marr);
          $rank[$r]=count($marr)-$num-$repeat+1;
          $rank2[] = array_merge($val,$rank);
        }
        return $rank2;
}

//获得比自己数小的个数
function gt_array_values($val,array $array){
        $num=0;
        for($i=0;$i<count($array);$i++){
                if($val>$array[$i]){
                        $num++;
                }
        }
        return $num;
}
//获得这个数的重复次数

function get_array_repeats($string,array $array) {
        $count = array_count_values($array);
        foreach ($count as $key => $value) {
                 if ($key == $string) {
                  return $value;
                  }
         }
}

逻辑也很简单,学生的名次,等于总人数减去比自己成绩低的人数,再减去和自己成绩一样的人数,再加一。

比自己成绩低的人数,和与自己成绩一样多的人数,分别是两个独立的函数,前者需要循环所有学生成绩,比自己成绩低的进行人数累加,每个学生都要进行这个循环,有点耗性能哈。后者只是单纯引用数组函数解决问题。

这样就可以根据考试成绩(字段名s),得到考生的排名(字段名r),但是很明显循环次数有点多,难以想象当数据量很大的时候情况是怎样的,所以还是建议查询的时候直接执行sql语句实现rank函数功能,这个网上有不少例子,如MySQL中rank函数如何实现

在这个例子中,当我们要查找id为1的学员的rank值的时候,直接运行sql语句如下:

select 
tmp.id,tmp.name,tmp.score,
@j:[email protected]+1 as j,
@k:=(case when @pre_score=tmp.score then @k else @j end) as rank,
@pre_score:=tmp.score as pre_score
from 
(
select * from score where id =1
) as tmp,
(select @k :=0,@j:=0, @pre_score:=0)
as mscore

j是顺序号,k是rank值

@k:=(case when @pre_score=tmp.score then @k else @j end

这句话意思是只有在前后二次排序值不同时才会使用顺序号,是关键的地方。

最后运行sql,用getRow函数得到id为1的这条数据,得到rank值。

时间: 2024-09-29 02:51:25

php和mysql仿excel的rank函数的相关文章

MySQL与EXCEL sum sumif sumifs 函数结合_品牌汇总_20161101

计算一些数不难,整体来说还是要培养自我的逻辑意识,逻辑清楚,代码自然而然就知道,总体上训练自己的逻辑,一个是从用户角度,一个是从产品角度. 用户角度需要考虑的是用户的活跃度,具体又可以细分为用户的注册日期,下单间隔,用户各个时间维度的订单数,订单额,等等 产品角度考虑产品分类,产品品牌,产品供应商角度等等. 今天一个需求是谈及一些品牌合作商合作,需要要一些数据,统计锦3个月的销量和金额,采购部门提供了一些品牌. 如果按照传统上出数,只需要在where 条件中加上 品牌 in (品牌1,品牌2,品

MySQL实现SQL Server排名函数

最近在MySQL中遇到分组排序查询时,突然发现MySQL中没有row_number() over(partition by colname)这样的分组排序.并且由于MySQL中没有类似于SQL Server中的row_number().rank().dense_rank()等排名函数,所有找到以下实现方法,在此简单记录一下. 首先创建一个表并插入测试数据. create table demo.Student ( ID int(11) NOT NULL AUTO_INCREMENT, StuNo

Excel 2016新增函数之IFS

Excel 2016新增函数之IFS 在2016年1月功能更新中,EXCEL 2016新增几个常用重要函数,主要有:ifs,switch,maxifs,minifs,concat,textjoin等. 注意,要能使用上述函数,Office的版本很重要,并不是所有的Office 2016能使用.建议 在https://products.office.com/zh-CN/try试用Office 365,安装最新版的Office 2016. 你也可以在通过Office 365安装程序进行在线安装.安装

Excel 2016新增函数之MaxIFS、MinIFS

Excel 2016新增函数之MaxIFS.MinIFS 在2016年1月功能更新中,EXCEL 2016新增几个常用重要函数,主要有:ifs,switch,maxifs,minifs,concat,textjoin等. 注意,要能使用上述函数,Office的版本很重要,并不是所有的Office 2016能使用.建议 在https://products.office.com/zh-CN/try试用Office 365,安装最新版的Office 2016. 你也可以在通过Office 365安装程

Excel 2016新增函数之TEXTJOIN

Excel 2016新增函数之TEXTJOIN 在2016年1月功能更新中,EXCEL 2016新增几个常用重要函数,主要有:ifs,switch,maxifs,minifs,concat,textjoin等. 注意,要能使用上述函数,Office的版本很重要,并不是所有的Office 2016能使用.建议 在https://products.office.com/zh-CN/try试用Office 365,安装最新版的Office 2016. 你也可以在通过Office 365安装程序进行在线

【图文】Excel中vlookup函数的使用方法

今天统计数据,用到了Excel中vlookup函数,第一次使用当然少不了百度,经过反复研究后,算是解决了问题,现整理成文档. 一.实现效果 Sheet1 Sheet2   注:上图中sheet1商品条码列(即D列)引用sheet2中商品条码(即B列)中的数据 二.vlookup函数调用说明 以sheet1中调用函数为例,如下: =VLOOKUP(A2,Sheet2!$A$2:$B$100,2,TRUE) 函数中共有四个调用参数 1)  第一个参数:A2 :可任意指定,也可以是B2.C2等.这一列

MySQL和时间戳有关的函数

1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()mysql> select current_timestamp, current_timestamp();+---------------------+---------------------+| current_timestamp | current_timestamp() |+---------------------+---------------------+| 2008-

R语言rank函数详细解析

1.rank函数是什么 rank相关文档[1]可以译为"返回原数组(?)中各个元素排序(?)后的秩次(?)",表面上看确实可以得到次序,但对数组.排序.秩次交待不清. 2.rank函数使用情景 比如,在100米赛跑中,甲乙丙三人的成绩为6.8s, 8.1s, 7.2s,那么用rank函数排序获得名次: > rank(t <- c(6.8, 8.1, 7.2)) [1] 1 3 2 再如,甲乙丙三人考试得分为74,92,85,用同样方法取得名次会适得其反.当然,我们可以认为执

八、mysql视图、存储过程、函数以及时间调度器

1.create or replace view emp_view as select * from t4 ;给t4表创建一个名为emp_view的视图 2.drop view emp_view 删除视图 ======================================= 1.创建一个存储过程(查询所有数据) create procedure p1 () READS SQL DATA BEGIN select * from t4; END 2.创建一个存储过程(查询传参数据) cre