oracle+sql去重复时间,sql 时间重复解决方案

sql 时间重复

如何将两张表中的时间段一条条的显示,并且要去掉重复的时间。

表1 : 主键id        code                             时间

1              500584105                 201301

2              500584105                 201302

3              500584105                 201303

4              500584105                 201304

表2 : 主键id        code                            开始 时间          结束时间

1              500584105                 201301              201307

查询的结果是:

500584105              201301

500584105              201302

500584105              201303

500584105              201304

500584105              201305

500584105              201306

500584105              201307

ps:这两张表要通过code关联。如果表2中的时间段包含表1中的时间则只显示一条

------解决思路----------------------

未测试,试一下

SELECT A.CODE,B.时间

(

select (select  to_char(add_months(to_date(min(开始时间),''yyyymm),d.rn-1),'yyyymm')  from 表2) 时间

from (select rowun rn from dual

connect by ROWNUM<=(SELECT MONTHS_BETWEEN(to_date(min(结束时间),''yyyymm),to_date(min(开始时间),''yyyymm))

FROM 表2)) D

) B,表2 A

WHERE A.开始 时间<=B.时间 AND  A.结束时间>=B.时间

union--union本身可以自动去重的

select code,时间 from 表1

------解决思路----------------------

SELECT t1.code, t2.st, t2.ed, t2.st + LEVEL - 1 ret

FROM (SELECT DISTINCT code

FROM tab_1) t1,

tab_2 t2

WHERE t1.code = t2.code

CONNECT BY t2.ed - t2.st - LEVEL + 1 >= 0

--tab_1:表一

--tabl_2:表二

--t2.ed:结束时间

--t2.st:开始时间

------解决思路----------------------

引用:Quote: 引用:SQL> select 500584105,201301+level-1 from dual connect by level<= (to_number(201307)-to_number(201301))+1

2  union

3  select 500584105,201301 from dual;

500584105 201301+LEVEL-1

---------- --------------

500584105         201301

500584105         201302

500584105         201303

500584105         201304

500584105         201305

500584105         201306

500584105         201307

已选择7行。

B表应该不只是这一行吧,是不是想得太简单了,呵呵

哈哈,我再加工一下

SQL> select * from t;

ID COL1                 COL2

---------- -------------------- --------------------

1 500584105            201301

2 500584105            201302

3 500584105            201303

4 500584105            201304

5 500584106            201302

6 500584106            201303

7 500584106            201304

8 500584106            201305

已选择8行。

SQL> select * from t1;

ID COL1                 D1                   D2

---------- -------------------- -------------------- ----------------

2 500584106            201301               201304

1 500584105            201301               201307

SQL>   select distinct col1, to_char(d1 + level - 1)/*, d1, d2*/

2      from t1

3    connect by level <= (to_number(d2) - to_number(d1)) + 1

4      union

5      select col1,col2 from t;

COL1                 TO_CHAR(D1+LEVEL-1)/*,D1,D2*/

-------------------- ----------------------------------------

500584105            201301

500584105            201302

500584105            201303

500584105            201304

500584105            201305

500584105            201306

500584105            201307

500584106            201301

500584106            201302

500584106            201303

500584106            201304

COL1                 TO_CHAR(D1+LEVEL-1)/*,D1,D2*/

-------------------- ----------------------------------------

500584106            201305

已选择12行。

------解决思路----------------------

引用:Quote: 引用:SELECT t1.code, t2.st, t2.ed, t2.st + LEVEL - 1 ret

FROM (SELECT DISTINCT code

FROM tab_1) t1,

tab_2 t2

WHERE t1.code = t2.code

CONNECT BY t2.ed - t2.st - LEVEL + 1 >= 0

--tab_1:表一

--tabl_2:表二

--t2.ed:结束时间

--t2.st:开始时间

大神,能否解释下,这个CONNECT BY t2.ed - t2.st - LEVEL + 1 >= 0;尤其是后面 - LEVEL + 1 是怎么个用法的。没太明白,多谢。

http://www.cnblogs.com/lettoo/archive/2010/08/03/1791239.html

这个介绍CONNECT BY的,里面有3个例子,你看看有介绍LEVEL,CONNECT_BY_ISLEAF等等介绍的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值