oracle连续重复值合并

today1858 2011-10-31 10:54:26
表t按callid,starttime排序后结果如下:
callid dno starttime entime
1001 3 1:00 2:00
1001 1 2:00 3:00
1001 2 3:00 4:00
1001 1 4:00 5:00
1001 1 5:00 6:00
1001 1 6:00 7:00
1001 2 7:00 8:00
1002 1 2:20 3:00

要将连续两条记录中callid,dno均相同的合并,开始时间为第一条的开始时间,结束时间为最后一条的结束时间。
结果如下:
callid dno starttime entime
1001 3 1:00 2:00
1001 1 2:00 3:00
1001 2 3:00 4:00
1001 1 4:00 7:00
1001 2 7:00 8:00
1002 1 2:20 3:00

求帮助。。。
...全文
370 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
BenChiM888 2011-10-31
  • 打赏
  • 举报
回复
改一下:
RANK()OVER(PARTITION BY callid,dno ORDER BY SUBSTR(starttime,1,1))



[TEST@myoracle] SQL>WITH T1 AS(
2 SELECT 1001 callid, 3 dno,'1:00' starttime, '2:00' entime FROM DUAL UNION ALL
3 SELECT 1001 callid, 1 dno,'2:00' starttime, '3:00' entime FROM DUAL UNION ALL
4 SELECT 1001 callid, 2 dno,'3:00' starttime, '4:00' entime FROM DUAL UNION ALL
5 SELECT 1001 callid, 1 dno,'4:00' starttime, '5:00' entime FROM DUAL UNION ALL
6 SELECT 1001 callid, 1 dno,'5:00' starttime, '6:00' entime FROM DUAL UNION ALL
7 SELECT 1001 callid, 1 dno,'6:00' starttime, '7:00' entime FROM DUAL UNION ALL
8 SELECT 1001 callid, 2 dno,'7:00' starttime, '8:00' entime FROM DUAL UNION ALL
9 SELECT 1002 callid, 1 dno,'2:20' starttime, '3:00' entime FROM DUAL UNION ALL
10 SELECT 1002 callid, 1 dno,'2:50' starttime, '4:00' entime FROM DUAL UNION ALL
11 SELECT 1003 callid, 1 dno,'3:00' starttime, '5:00' entime FROM DUAL
12 )SELECT callid,dno,MIN(starttime) starttime,MAX(entime)entime
13 FROM(
14 SELECT callid,dno,starttime,entime,
15 SUBSTR(starttime,1,1)-RANK()OVER(PARTITION BY callid,dno ORDER BY SUBSTR(starttime,1,1)) ROW_
16 FROM T1)
17 GROUP BY callid,dno,ROW_
18 ORDER BY 1,3
19 ;

CALLID DNO STAR ENTI
---------- ---------- ---- ----
1001 3 1:00 2:00
1001 1 2:00 3:00
1001 2 3:00 4:00
1001 1 4:00 7:00
1001 2 7:00 8:00
1002 1 2:20 4:00
1003 1 3:00 5:00

已选择7行。
today1858 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cosio 的回复:]
SQL code
还有没有其他的情况?

如: 1002 1 2:20 3:00
1002 1 2:50 4:00
[/Quote]

有这种情况,也要合并,只要callid和dno连续相同就合并
today1858 2011-10-31
  • 打赏
  • 举报
回复
前后两条记录,如果callid和dno都相同的话,就合并,直至不在出现前后两条记录的callid和dno相同
today1858 2011-10-31
  • 打赏
  • 举报
回复
这些数据我只是列了一部分,也可能还有
1002 1 2:20 3:00
1002 1 2:50 4:00 1003 1 3:00 5:00

cosio 2011-10-31
  • 打赏
  • 举报
回复
SUBSTR(starttime, 1, 1)  --没有考虑包涵的情况!
cosio 2011-10-31
  • 打赏
  • 举报
回复
with t as
(
select '1001' a, 3 b, '1:00' c, '2:00' d from dual
union all
select '1001', 1, '2:00', '3:20' from dual
union all
select '1001', 2, '3:00', '4:30' from dual
union all
select '1001', 1, '4:00', '5:30' from dual
union all
select '1001', 1, '5:20', '5:50' from dual
union all
select '1001', 1, '5:40', '7:00' from dual
union all
select '1001', 2, '7:00', '8:00' from dual
)

--楼上,这样子的数据,就不行了!
BenChiM888 2011-10-31
  • 打赏
  • 举报
回复

[TEST@myoracle] SQL>WITH T1 AS(
2 SELECT 1001 callid, 3 dno,'1:00' starttime, '2:00' entime FROM DUAL UNION ALL
3 SELECT 1001 callid, 1 dno,'2:00' starttime, '3:00' entime FROM DUAL UNION ALL
4 SELECT 1001 callid, 2 dno,'3:00' starttime, '4:00' entime FROM DUAL UNION ALL
5 SELECT 1001 callid, 1 dno,'4:00' starttime, '5:00' entime FROM DUAL UNION ALL
6 SELECT 1001 callid, 1 dno,'5:00' starttime, '6:00' entime FROM DUAL UNION ALL
7 SELECT 1001 callid, 1 dno,'6:00' starttime, '7:00' entime FROM DUAL UNION ALL
8 SELECT 1001 callid, 2 dno,'7:00' starttime, '8:00' entime FROM DUAL UNION ALL
9 SELECT 1002 callid, 1 dno,'2:20' starttime, '3:00' entime FROM DUAL
10 )SELECT callid, dno, MIN(starttime) starttime, MAX(entime) entime
11 FROM (SELECT callid,
12 dno,
13 starttime,
14 entime,
15 SUBSTR(starttime, 1, 1) - ROW_NUMBER() OVER(PARTITION BY callid, dno ORDER BY starttime) ROW_
16 FROM T1)
17 GROUP BY callid, dno, ROW_
18 ORDER BY 1, 3
19 ;

CALLID DNO STAR ENTI
---------- ---------- ---- ----
1001 3 1:00 2:00
1001 1 2:00 3:00
1001 2 3:00 4:00
1001 1 4:00 7:00
1001 2 7:00 8:00
1002 1 2:20 3:00

已选择6行。

wangyan3422 2011-10-31
  • 打赏
  • 举报
回复
建议添加一列辅助列用于分组如下:
callid dno starttime entime flag
1001 3 1:00 2:00 1
1001 1 2:00 3:00 2
1001 2 3:00 4:00 3
1001 1 4:00 5:00 4
1001 1 5:00 6:00 4
1001 1 6:00 7:00 4
1001 2 7:00 8:00 5
1002 1 2:20 3:00 6
该列可以是业务过程中进行计算,也可以在生成结果是进行计算。
cosio 2011-10-31
  • 打赏
  • 举报
回复
还有没有其他的情况?

如: 1002 1 2:20 3:00
1002 1 2:50 4:00


today1858 2011-10-31
  • 打赏
  • 举报
回复
结果怎么总是将第二条和4,5,6条记录合并在一起去了
today1858 2011-10-31
  • 打赏
  • 举报
回复
求助,感激不尽,等待答案。。
today1858 2011-10-31
  • 打赏
  • 举报
回复
佩服佩服,正解,但是用在以下数据就不对了。

1001 3 2011-10-11 1:00:00 2011-10-11 1:05:00
1001 1 2011-10-11 1:05:00 2011-10-11 1:20:00
1001 2 2011-10-11 1:20:00 2011-10-11 1:05:00
1001 1 2011-10-11 1:30:00 2011-10-11 1:40:00
1001 1 2011-10-11 1:40:00 2011-10-11 1:55:00
1001 1 2011-10-11 1:55:00 2011-10-11 1:57:00
1001 2 2011-10-11 1:57:00 2011-10-11 1:59:00
1002 3 2011-10-11 1:00:00 2011-10-11 1:10:00
1002 1 2011-10-11 1:10:00 2011-10-11 1:30:00
1002 1 2011-10-11 1:30:00 2011-10-11 1:35:00
1002 2 2011-10-11 1:35:00 2011-10-11 1:50:00
1003 1 2011-10-11 1:10:00 2011-10-11 1:20:00
1003 1 2011-10-11 1:20:00 2011-10-11 1:40:00
1003 1 2011-10-11 1:40:00 2011-10-11 1:50:00

自己依葫芦画瓢画了很久,还是没得到想要的,能否帮忙解答下。。。
BenChiM888 2011-10-31
  • 打赏
  • 举报
回复
2-11行是测试数据,测试数据起名T1
12-19为SQL,你自己把这段sql拿出来 T1,改成你自己的不就得了。


[Quote=引用 10 楼 today1858 的回复:]

引用 9 楼 benchim888 的回复:
改一下:
RANK()OVER(PARTITION BY callid,dno ORDER BY SUBSTR(starttime,1,1))



SQL code

[TEST@myoracle] SQL>WITH T1 AS(
2 SELECT 1001 callid, 3 dno,'1:00' starttime, '2……
[/Quote]
today1858 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 benchim888 的回复:]
改一下:
RANK()OVER(PARTITION BY callid,dno ORDER BY SUBSTR(starttime,1,1))



SQL code

[TEST@myoracle] SQL>WITH T1 AS(
2 SELECT 1001 callid, 3 dno,'1:00' starttime, '2:00' entime FROM DUAL ……
[/Quote]


不行,T1不能固定这么写,2-11行你写死了,表里可能有成千上万条数据,不可能一一列出

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧