+ -
当前位置:首页 → 问答吧 → oracle 结果集B中时间与结果集A中时间差最小的记录?????

oracle 结果集B中时间与结果集A中时间差最小的记录?????

时间:2011-12-13

来源:互联网

SQL code

A
ID  time
01  2011/12/12 10:10:10
03  2011/12/11 09:00:05
B
ID  time
01  2011/12/12 10:11:00
01  2011/11/11 09:00:03
01  2010/11/11 11:11:11
.....


我的结果集A和B 通过ID连接查询
我想要 A.id = B.id and B.time < A.time and (A.time-B.time)最小的记录


如上,查处的记录应为

01 2010/11/11 11:11:11







作者: xk_su   发布时间: 2011-12-13

实测数据:
SQL code

CREATE TABLE T47
(
    ID VARCHAR2(20),
    MyTime DATE
);

INSERT INTO T47 VALUES('01', to_date('2011/12/12 10:10:10', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO T47 VALUES('03', to_date('2011/12/11 09:00:05', 'YYYY-MM-DD HH24:MI:SS'));

CREATE TABLE T48
(
    ID VARCHAR2(20),
    MyTime DATE
);

INSERT INTO T48 VALUES('01', to_date('2011/12/12 10:11:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO T48 VALUES('01', to_date('2011/11/11 09:00:03', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO T48 VALUES('01', to_date('2010/11/11 11:11:11', 'YYYY-MM-DD HH24:MI:SS'));



实测结果:

作者: LuiseRADL   发布时间: 2011-12-13

实测结果:

作者: LuiseRADL   发布时间: 2011-12-13

注意:如果最后一条记录是2010年的话,应该是我这个结果。

作者: LuiseRADL   发布时间: 2011-12-13

。。。有没有什么函数可以用的,上面这个太复杂了

比如rank over什么的,我想的先rank over一下,然后选某条就好了


rank() over(partition by a.id order by b.time) rk

作者: xk_su   发布时间: 2011-12-13

SQL code

SELECT T.ID, T.TIME, DURATION
  FROM (
        
        SELECT TM1.ID, TM2.TIME, TM1.TIME - TM2.TIME DURATION
          FROM TM1, TM2
         WHERE TM1.ID = TM2.ID
           AND TM1.TIME > TM2.TIME) T
 WHERE DURATION =
       (SELECT MIN(DURATION)
          FROM (SELECT TM1.ID, TM2.TIME, TM1.TIME - TM2.TIME DURATION
                  FROM TM1, TM2
                 WHERE TM1.ID = TM2.ID
                   AND TM1.TIME > TM2.TIME)
         WHERE ID = T.ID);

作者: yinan9   发布时间: 2011-12-13

SQL code
select C.ID,C.time from
(
select B.ID,B.time,(A.time-B.time) cha 
from A,B 
where A.id = B.id and B.time < A.time order by cha asc
)C 
where rownum<2

作者: xpingping   发布时间: 2011-12-13

热门下载

更多