操作的表:user
表数据:
需求:我们需要对sex这个字段进行年龄排名,年龄小的在前,大的在后
1,对使用sql语句对查询结果,添加一个序号
这种方式是你已经用SQL处理好已经排好序的数据,单独加了一个序号的方式
// (SELECT @i:=0)j 声明一个变量(注意,如果声明的变量是关键字则会异常),变量初始值为 0,每次让它+1
// 声明一个变量 (@i:=@i+1)"字段”
SELECT (@i:=@i+1)"序号", u.* FROM 表名 u,(SELECT @i:=0)j
异常声明方式:不能使用rank命令
SELECT (@i:=@i+1)"序号", u.* FROM user u,(SELECT @i:=0)rank
- 示例1:未对目标值进行排序
从这里可以看到,序号已经有了,但是我们的sex字段还没有做处理
- 示例2:对目标进行处理,再加入序号
可以看到我们的sex已经排好序,也有了使用序号作为排名字段(这种方式比较简单,下面还有更高级的往下看)
2,根据sex 增加序号,并且按照sex相同的并列
select c.* ,ifnull((
select count(*) from
(select * from user order by sex ) as b
where c.sex > b.sex
),0)+1 as rownum from
(select * from user order by sex ) as c
效果如下:
如果是要按小的在后,大的在前排名,改成小于
效果如下:
3,使用集合接收这些数据进行处理
public static void main(String[] args) {
// BigDecimal类型
ArrayList<User> list = new ArrayList<>();
list.add(new User(1,"myqxin","1234",11,null,null));
list.add(new User(2,"zfwy","4353",12,null,null));
list.add(new User(3,"qyls","6145",17,null,null));
list.add(new User(4,"ly","2342",12,null,null));
list.add(new User(5,"bl","2532",13,null,null));
List<User> users = mergerList(list);
for (User user : users) {
System.err.println(user);
}
}
public static List<User> mergerList(List<User> list){
//list降序排序
List<User> collect = list.stream().sorted(Comparator.comparing(User::getSex)).collect(Collectors.toList());
//翻转list
Collections.reverse(collect);
Integer index=1;
Integer maxScore=0;
for (int i = 0; i < list.size(); i++) {
if (i==0){
collect.get(i).setRanking(index);
maxScore=collect.get(i).getSex();
}else if (Objects.equals(collect.get(i).getSex(),maxScore)){
collect.get(i).setRanking(index);
}else {
index++;
collect.get(i).setRanking(index);
maxScore=collect.get(i).getSex();
}
}
return collect;
}
效果如下:
这个与上面的排名相比,上面是进行了占位。这种事依次排列下去,不会存在出现相同的进行了占位
4,对对象某个属性值排名,值相同的并列
public static List<ExcellentRanking> mergerList(List<ExcellentRanking> list) {
if (list.size() < 1) {
return new ArrayList<ExcellentRanking>();
}
ArrayList<ExcellentRanking> restwo = new ArrayList<>();
// 对需要排名的值做了处理
for (ExcellentRanking airQualityRankingResp : list) {
if (airQualityRankingResp.getValue() == null) {
airQualityRankingResp.setValue(0.0);
restwo.add(airQualityRankingResp);
} else {
restwo.add(airQualityRankingResp);
}
}
//list降序排序
List<ExcellentRanking> collect = restwo.stream().sorted(Comparator.comparing(ExcellentRanking::getValue)).collect(Collectors.toList());
//翻转list
Collections.reverse(collect);
for (ExcellentRanking airQualityRankingResp : restwo) {
int index = 1;
for (ExcellentRanking airQualityRankingResp1 : collect) {
// > 值越小排名越靠前 < 值越大排名越靠前
if (airQualityRankingResp.getValue() < airQualityRankingResp1.getValue()) {
index++;
}
}
airQualityRankingResp.setRanking(index);
}
return restwo;
}
效果: