case 搞定分组内按照不同字段排序

今天开发问了个查询:

 

表T有字段a,b,c,都是数字型的
我想select得到的结果排序是这样:
优先按照a降序排列,
a相同且a=1的记录,则按照b字段降序
a相同且a=0的记录,按照c字段降序排

 

其实很容易想到用oracle函数,case,rank之类的,但是rank只是按A分组后按照B排序,不能既按照B又按照C。

最后用case搞定。

 

SQL> select * from hmtest;

         A          B          C
---------- ---------- ----------
         1          4          5
         1          3          6
         1          2          1
         0          2          6
         0          3          5

SQL> select * from hmtest order by a desc,case when a=1 then b else c end desc; (a只有1和0两个值)

         A          B          C
---------- ---------- ----------
         1          4          5
         1          3          6
         1          2          1
         0          2          6
         0          3          5

 

嘿嘿,其实很简单,先写篇日志垫垫底,以后多补充些吧。纪念我的DBA之路,也让自己的生活多充实些。


唉,就知道没有这么简单。今天开发把具体的表结构给了,发现排序的两个字段类型不同。


 score NUMBER(8,4)

 rank_date DATE

 stick_flag NUMBER(2)


stick_flag=1的按照 score 降序排序,stick_flag=0的按照rank_date降序排列


select ... from ...where...

 order by stick_flag desc,

              case

                when stick_flag = 1 then

                 r.rank_date

                else

                 r.score

              end desc;


会报错


类型得一致。后来想了想,用伪列来实现的。


select ...

       (case when r.stick_flag=1 then r.score else 0 end) ord  (新增一列ord,当flag为1时取score的值,当flag为0时统一为0,因为score的值不会小于0)

  from....

 where ....

 order by stick_flag desc,ord desc,r.rank_date desc;

在Java中,可以使用`List`接口的`sort`方法结合`Comparator`接口来对`List<AutoCase> caseList`根据某个字段进行排序。以下是一个示例代码,展示了如何根据`AutoCase`类中的某个字段进行排序: ```java import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; class AutoCase { private int id; private String name; // 其他字段... // 构造方法,getter和setter方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } // equals和hashCode方法,如果用到比较或集合中 // ... } public class Main { public static void main(String[] args) { List<AutoCase> caseList = new ArrayList<>(); // 填充caseList... // 根据id字段进行升序排序 Collections.sort(caseList, new Comparator<AutoCase>() { @Override public int compare(AutoCase o1, AutoCase o2) { return Integer.compare(o1.getId(), o2.getId()); } }); // 或者使用Java 8的lambda表达式进行简写 // caseList.sort((o1, o2) -> Integer.compare(o1.getId(), o2.getId())); // 现在caseList已经根据id字段升序排序完成 } } ``` 在上面的代码中,我们定义了一个`AutoCase`类,并且有一个`id`字段。然后我们创建了一个`AutoCase`对象的列表`caseList`。使用`Collections.sort`方法,传入一个实现了`Comparator`接口的匿名内部类实例,指定了根据`id`字段的值对列表中的元素进行升序排序。如果你使用的是Java 8或更高版本,可以使用lambda表达式来简化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值