在线等 有关对(lag函数)的使用或者其他的函数可以达到目的的也可以

在一张日历表中有一个字段名称为ISOM,只存在两个数值,0的意思代表不是交易日,1的意思代表交易,另外有一个字段TIME,就是按顺序来的日期,怎样凑出第三个字段C,这个字段的意思是,如果ISOM为0,则要取上一个最近的标为1的日期,如果为1,就取当天的日期
(在ORACLE里面执行)

2个回答

发让人让人人反反复复

baidu_24320823
baidu_24320823 看不懂啥意思
接近 6 年之前 回复
 create table test_date(
   t_TIME varchar(20),
   t_ISOM number default 0
)
DELETE FROM test_date;
insert into test_date(t_TIME,t_ISOM) values('20140101',1);
insert into test_date(t_TIME,t_ISOM) values('20140102',0);
insert into test_date(t_TIME,t_ISOM) values('20140103',0);
insert into test_date(t_TIME,t_ISOM) values('20140104',0);
insert into test_date(t_TIME,t_ISOM) values('20140105',0);
insert into test_date(t_TIME,t_ISOM) values('20140106',0);
insert into test_date(t_TIME,t_ISOM) values('20140107',0);
insert into test_date(t_TIME,t_ISOM) values('20140108',1);
insert into test_date(t_TIME,t_ISOM) values('20140109',1);
insert into test_date(t_TIME,t_ISOM) values('20140110',0);
insert into test_date(t_TIME,t_ISOM) values('20140111',1);
insert into test_date(t_TIME,t_ISOM) values('20140112',0);
insert into test_date(t_TIME,t_ISOM) values('20140113',0);
insert into test_date(t_TIME,t_ISOM) values('20140114',1);

select
case when T_ISOM=1 THEN T_TIME
ELSE
N
END RESULT_TIME --要的结果
,C.*
FROM
(
SELECT B.*,(M-B.T_TIME) AS M_D,(B.T_TIME-N) AS N_D FROM
(
SELECT A.*,MAX(DNEXT) OVER(PARTITION BY x) AS M,MIN(DPRE) OVER(PARTITION BY x) AS N FROM
(
SELECT t_TIME,t_ISOM,ROW_NUMBER() OVER(ORDER BY t_TIME)-ROW_NUMBER() OVER(PARTITION BY t_ISOM ORDER BY t_TIME) x
,Lead(t_TIME) over(order by t_TIME) as dnext,lag(t_TIME) over(order by t_TIME) as dpre
FROM test_date
) A order by t_time
) B
) c order by t_time

> 
baidu_24320823
baidu_24320823 大神啊 你这个加点注释就好了 刚入门就碰到这么复杂的问题 看的我想哭了 真的非常感谢
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问