Greatest and Least 的使用

    最近做报表的时候突然遇到一个这样的需求:

    取站点表中的a列、b列、c列的最晚时间,需要所有站点的这三个环节都完成,并且取最晚时间,如果有一个环节没有完成,时间就取null。

其中有三列时间分别为

     a列       b列        c列

1 2010-2-4  
2 2010-2-5  
3 2010-2-6  
4 2010-2-3   2010-2-3   2010-2-3
5 2010-2-3   2010-2-3   2010-2-3
6 2010-2-3   2010-2-3   2010-2-3
7 2011-1-2   2011-1-2   2011-1-2
8 2011-1-1   2011-1-3 

 

第一种思路是先分别求a,b,c三列的最大值,然后再比较a,b,c三列中的最大时间。

select greatest(max(cw.a),
                max(cw.b),
                max(cw.c)

                )
  from 表 cw

 

这样就得到a,b,c三列中最大的时间。

    注意:greatest函数,例greatest(a,b,c),如果a,b,c当中有任一值为null,greatest就会取值为null

 

    由于max函数求最大时间直接取最大的时间了,而要求是如果时间有null就取null值,而不是取最大时间,于是就需要做特殊处理了。

    可以先将null转为最大时间如'2999-01-01',这样调用max如果b列就有null值就会取到最大值'2999-01-01',然后再将最大时间转为null即可。

select case when  max(nvl(cw.b,to_date('2999-01-01','yyyy-mm-dd'))) = to_date('2999-01-01','yyyy-mm-dd') then null
       else max(nvl(cw.b,to_date('2999-01-01','yyyy-mm-dd'))) end     
 from 表 cw

 

 

 附:

SELECT id, chinese, math, english,
  
        greatest(chinese, math, english) max,
  
         least(chinese, math, english) min
  
 FROM   tb;

        ID    CHINESE       MATH    ENGLISH        
MAX        MIN
        ---------- ---------- ---------- ---------- ---------- ----------
      1001         89         98         87         98         87
      
1002         81         87         79         87         79

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值