最近做报表的时候突然遇到一个这样的需求:
取站点表中的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