查看: 13012|回复: 33

求一个某字段连续重复的条数的sql写法

[复制链接]
论坛徽章:
72
2017金鸡报晓
日期:2017-01-10 15:39:05秀才
日期:2016-01-21 13:37:04秀才
日期:2016-02-18 09:19:48秀才
日期:2016-06-23 14:15:06海蓝宝石
日期:2015-11-20 16:38:13秀才
日期:2017-03-28 15:59:38秀才
日期:2017-03-20 13:42:20秀才
日期:2017-03-01 13:53:39弗兰奇
日期:2016-11-21 09:48:54祖母绿
日期:2015-12-03 16:13:25
跳转到指定楼层
1#
发表于 2010-3-31 13:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
引用有位仁兄的数据,问下大虾们


表结构和数据如下
要求:每个电话号码(tel_no),按照时间顺序(call_date_time),呼叫结果是01(call_result ='01')的连续重复的最大次数。
create table test
(
    tel_no                         varchar2(20) not null,
    call_date_time                 varchar2(20) not null,
    call_result                    varchar2(20) not null
)
/
insert into test values('1300000000', '2008010101', '01');
insert into test values('1300000000', '2008010103', '02');
insert into test values('1300000000', '2008010104', '01');
insert into test values('1300000000', '2008010106', '01');
insert into test values('1300000000', '2008010107', '09');
insert into test values('1333333333', '2008010101', '01');
insert into test values('1333333333', '2008010102', '01');
insert into test values('1333333333', '2008010103', '02');
insert into test values('1333333333', '2008010104', '01');
insert into test values('1333333333', '2008010105', '01');
insert into test values('1333333333', '2008010105', '01');
insert into test values('1333333333', '2008010106', '01');
insert into test values('1333333333', '2008010107', '09');
commit;

13000000000 连续重复出现1回,显示1
13333333333 连续重复出现2回,一回重复2次,一回重复4次,所以显示2
要求结果:
13000000000   1
13333333333   2

要是求连续重复次数超过3次的回数呢?
要求结果:
13333333333    1

[ 本帖最后由 hbb239 于 2010-3-31 16:53 编辑 ]
论坛徽章:
13
铁扇公主
日期:2008-08-23 12:15:03奥运会纪念徽章:足球
日期:2008-08-28 20:19:082009日食纪念
日期:2009-07-22 09:30:002010年世界杯参赛球队:葡萄牙
日期:2010-03-11 08:38:072010年世界杯参赛球队:加纳
日期:2010-03-17 14:44:352012新春纪念徽章
日期:2012-01-04 11:53:29奥运会纪念徽章:拳击
日期:2012-06-18 16:33:22蛋疼蛋
日期:2013-04-03 16:41:24
2#
发表于 2010-3-31 16:10 | 只看该作者
跌跌撞撞写了一个,期待更好的代码
with a as(select t.*,decode(t.call_result,lag(t.call_result) over(partition by t.tel_no order by t.call_date_time),rownum) c1
from test t),
b as(select a.*,connect_by_isleaf lf from a where c1 is not null connect by c1 = prior c1+1 )
select tel_no,count(distinct c1) from b where lf = 1 group by tel_no

使用道具 举报

回复
论坛徽章:
0
3#
发表于 2010-3-31 16:24 | 只看该作者

回复 #1 hbb239 的帖子

重复的最大次数。
13000000000 连续重复的只有1条,显示1
13333333333 有两条重复记录,一个是重复2次,一个重复4次 显示2
要求结果:
13000000000   1
13333333333   2
怎么和需求不一样啊?我理解错了?

使用道具 举报

回复
论坛徽章:
72
2017金鸡报晓
日期:2017-01-10 15:39:05秀才
日期:2016-01-21 13:37:04秀才
日期:2016-02-18 09:19:48秀才
日期:2016-06-23 14:15:06海蓝宝石
日期:2015-11-20 16:38:13秀才
日期:2017-03-28 15:59:38秀才
日期:2017-03-20 13:42:20秀才
日期:2017-03-01 13:53:39弗兰奇
日期:2016-11-21 09:48:54祖母绿
日期:2015-12-03 16:13:25
4#
 楼主| 发表于 2010-3-31 16:33 | 只看该作者
原帖由 homeworld80 于 2010-3-31 16:10 发表
跌跌撞撞写了一个,期待更好的代码
with a as(select t.*,decode(t.call_result,lag(t.call_result) over(partition by t.tel_no order by t.call_date_time),rownum) c1
from test t),
b as(select a.*,connect_by_isleaf lf from a where c1 is not null connect by c1 = prior c1+1 )
select tel_no,count(distinct c1) from b where lf = 1 group by tel_no



牛人,正确~!

使用道具 举报

回复
论坛徽章:
72
2017金鸡报晓
日期:2017-01-10 15:39:05秀才
日期:2016-01-21 13:37:04秀才
日期:2016-02-18 09:19:48秀才
日期:2016-06-23 14:15:06海蓝宝石
日期:2015-11-20 16:38:13秀才
日期:2017-03-28 15:59:38秀才
日期:2017-03-20 13:42:20秀才
日期:2017-03-01 13:53:39弗兰奇
日期:2016-11-21 09:48:54祖母绿
日期:2015-12-03 16:13:25
5#
 楼主| 发表于 2010-3-31 16:38 | 只看该作者
要是求重复超过4次的回数呢?
也就是说结果只显示结果
13333333333   1

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
6#
发表于 2010-3-31 16:53 | 只看该作者
重复超过2次的也可这么写:
select tel_no, count(0) cnt
  from (select tel_no, call_result,
               lag(call_result) over(partition by tel_no order by call_date_time) r1,
               lead(call_result) over(partition by tel_no order by call_date_time) r2
          from test)
where call_result = '01'
   and nvl(r1, '02') = '02'
   and r2 = '01'
group by tel_no;

使用道具 举报

回复
论坛徽章:
72
2017金鸡报晓
日期:2017-01-10 15:39:05秀才
日期:2016-01-21 13:37:04秀才
日期:2016-02-18 09:19:48秀才
日期:2016-06-23 14:15:06海蓝宝石
日期:2015-11-20 16:38:13秀才
日期:2017-03-28 15:59:38秀才
日期:2017-03-20 13:42:20秀才
日期:2017-03-01 13:53:39弗兰奇
日期:2016-11-21 09:48:54祖母绿
日期:2015-12-03 16:13:25
7#
 楼主| 发表于 2010-3-31 16:56 | 只看该作者
原帖由 nyfor 于 2010-3-31 16:53 发表
重复超过2次的也可这么写:
select tel_no, count(0) cnt
  from (select tel_no, call_result,
               lag(call_result) over(partition by tel_no order by call_date_time) r1,
               lead(call_result) over(partition by tel_no order by call_date_time) r2
          from test)
where call_result = '01'
   and nvl(r1, '02') = '02'
   and r2 = '01'
group by tel_no;




也对   不过我要重复超过3次的回数呢?

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
8#
发表于 2010-3-31 16:56 | 只看该作者
重复超过4次的回数,利用上面的笨办法可以写成:
select tel_no, count(0) cnt
  from (select tel_no, call_result,
               lag(call_result) over(partition by tel_no order by call_date_time) r1,
               lead(call_result,1) over(partition by tel_no order by call_date_time) r2,
               lead(call_result,2) over(partition by tel_no order by call_date_time) r3,
               lead(call_result,3) over(partition by tel_no order by call_date_time) r4
          from test)
where call_result = '01'
   and nvl(r1, '02') = '02'
   and r2 = '01' and r3 = '01' and r4 = '01'
group by tel_no;

使用道具 举报

回复
论坛徽章:
72
2017金鸡报晓
日期:2017-01-10 15:39:05秀才
日期:2016-01-21 13:37:04秀才
日期:2016-02-18 09:19:48秀才
日期:2016-06-23 14:15:06海蓝宝石
日期:2015-11-20 16:38:13秀才
日期:2017-03-28 15:59:38秀才
日期:2017-03-20 13:42:20秀才
日期:2017-03-01 13:53:39弗兰奇
日期:2016-11-21 09:48:54祖母绿
日期:2015-12-03 16:13:25
9#
 楼主| 发表于 2010-3-31 17:00 | 只看该作者
那我要写出重复超过20次的回数不是一大串?
期待更好的办法

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
10#
发表于 2010-3-31 17:41 | 只看该作者
通用的:
select tel_no, count(times) cnt
  from (select tel_no, r2,
                rn + 1 - lag(rn) over(partition by tel_no order by rn) times
           from (select tel_no, call_result,
                         row_number() over(partition by tel_no order by call_date_time) rn,
                         lag(call_result) over(partition by tel_no order by call_date_time) r1,
                         lead(call_result) over(partition by tel_no order by call_date_time) r2
                    from test)
          where (nvl(r1, '*') = '01' and call_result = '01' and nvl(r2, '*') <> '01')
             or (nvl(r1, '*') <> '01' and call_result = '01' and nvl(r2, '*') = '01'))
where nvl(r2, '*') <> '01' and times >= 4 /* 次数 */
group by tel_no;

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表