|
|
原帖由 addm 于 2008-11-3 22:03 发表 ![]()
CHENCH@lilac> l
1 SELECT id,station,
2 p_start_date,
3 NVL(p_end_date, p_start_date) p_end_date,
4 start_date,
5 END_date,
6 CASE
7 when p_end_date is null or p_end_date
这位兄弟的SQL写得真不错,但如果我加入这么一条数据就会出问题:
insert into tmp3 (ID, STATION, START_DATE, END_DATE)
values ('1000', 'QA LEAD', to_date('01-01-2000', 'dd-mm-yyyy'), to_date('01-03-2000', 'dd-mm-yyyy'));
修改一下:
SELECT id,station,
p_end_date,
start_date,
END_date,
CASE
when p_end_date is null or p_end_date <= start_date THEN
MONTHS_BETWEEN(end_date, start_date)
WHEN end_date <= p_end_date THEN
0
WHEN start_date <= p_end_date THEN
MONTHS_BETWEEN(end_date, p_end_date)
END months
FROM (select id,station,
max(end_date) over(PARTITION BY id order by start_date,end_date DESC ROWS between unbounded preceding and 1 preceding) p_end_date,
start_date,
end_date
from tmp3
)
order by start_date
/
第四题的写法很是巧妙,我钻个牛角尖,如果addvalue有正数负数就不行了, 因为addvalue_c已经不往一个方向变化
[ 本帖最后由 newkid 于 2008-11-4 05:35 编辑 ] |
|