一组通话记录(总共500万条):
ID 主叫号码 被叫号码 通话起始时间   通话结束时间           通话时长
1  98290000 0215466546656 2007-02-01 09:49:53.000 2007-02-01 09:50:16.000 23
2  98290000 021546654666  2007-02-01 09:50:29.000 2007-02-01 09:50:41.000 12
3  98290000 021546654666  2007-02-01 09:50:58.000 2007-02-01 09:51:12.000 14
4  68290900 0755133329866 2007-02-01 10:04:31.000 2007-02-01 10:07:13.000 162
5  78290000 0755255708638 2007-02-01 10:48:26.000 2007-02-01 10:49:23.000 57
6  78290000 0755821119109 2007-02-01 10:49:39.000 2007-02-01 10:52:55.000 196
7  78290000 035730928370  2007-02-01 11:30:45.000 2007-02-01 11:31:58.000 73
8  78290000 0871138889904 2007-02-01 11:33:47.000 2007-02-01 11:35:00.000 73
9  68290000 035730928379  2007-02-01 11:52:20.000 2007-02-01 11:54:56.000 156
10 68290000 0298521811199 2007-02-01 12:44:45.000 2007-02-01 12:45:04.000 19
求其中同一个号码的两次通话之间间隔大于10秒的通话记录ID
这个sql应该怎么写呢 ?
无论是主叫还是被叫都算一次通话  
----------------------------------
这个是我们班同学的一 个面试题目  帮忙看看

解决方案 »

  1.   

    你朋友面试什么岗位呀?
    考这个。。select id from 
    (select ID, 主叫号码 as num,通话起始时间 as sj,通话时长  from yourtable
    union 
    select ID,  被叫号码  as num,通话起始时间 as sj,通话时长  from yourtable
    union
    select ID, 主叫号码 as num,通话结束时间 as sj,通话时长  from yourtable
    union
    select ID, 主叫号码 as num,通话结束时间 as sj,通话时长  from yourtable
    where (lag(sj,1) over(partition by num order by sj )+ interval '10' second< sj) 
      

  2.   

    有点错~~
    select id from 
    (select ID, 主叫号码 as num,通话起始时间 as sj,通话时长  from yourtable
    union 
    select ID,  被叫号码  as num,通话起始时间 as sj,通话时长  from yourtable
    union
    select ID, 主叫号码 as num,通话结束时间 as sj,通话时长  from yourtable
    union
    select ID, 被叫号码 as num,通话结束时间 as sj,通话时长  from yourtable
    where (lag(sj,1) over(partition by num order by sj )+ interval '10' second< sj)
      

  3.   

    这个用分析函数lag或者lead就能解决
      

  4.   

    select m.id from
    (
    select id , 号码 , 通话时长 , row_number() over(order by 号码 , 时间) px from
    (
      select id , 主叫号码 号码 , 通话起始时间 时间 , 通话时长 from tb
      union all
      select id , 被叫号码 号码 , 通话结束时间 时间 , 通话时长 from tb
    ) t
    ) m ,
    (
    select id , 号码 , 通话时长 , row_number() over(order by 号码 , 时间) px from
    (
      select id , 主叫号码 号码 , 通话起始时间 时间 , 通话时长 from tb
      union all
      select id , 被叫号码 号码 , 通话结束时间 时间 , 通话时长 from tb
    ) t
    ) n
    where m.号码 = n.号码 and m.px = n.px - 1 and (m.通话时长 > 10 or n.通话时长 > 10)
      

  5.   

    参考2楼 Select id,num from(
    select id,num,sj,lag(sj,1) over(partition by num order by sj )+ interval '10' second as flag1,
    lag(id,1) over(partition by num order by sj ) as flag2 from 
    (select ID, 主叫号码 as num,通话起始时间 as sj,通话时长  from yourtable
    union 
    select ID,  被叫号码  as num,通话起始时间 as sj,通话时长  from yourtable
    union
    select ID, 主叫号码 as num,通话结束时间 as sj,通话时长  from yourtable
    union
    select ID, 主叫号码 as num,通话结束时间 as sj,通话时长  from yourtable))
    where flag1< sj and id <> flag2;
      

  6.   

    其实我可以把问题简单化的,这个只是要计算一出下次通话开始时间就很好解决问题了,思路如下:
    create table 间隔计主叫号码算表 (ID,主叫号码 被叫号码 本次通话结束时间 下次开始通话的ID,下次开始通话的时间);
    select (ID,主叫号码,被叫号码,本次通话结束时间) from 原始表 Insert Into  间隔计算表 ;
    update 间隔计算表 a 
    set a.下次开始通话的ID =(select min(id) from 原始表 b where a.主叫号码 = b.主叫号码 and b.ID>a.ID order by b.ID);
    update 间隔计算表 a 
    set a.下次开始通话的时间 =(select 开始通话的时间 from 原始表 b where a.下次开始通话的ID = b.ID);OK,开始做简单查询了:
    Select ID from 间隔计算表 where 下次开始通话的时间 - 本次通话结束时间>10秒结果就都出来了。
      

  7.   

    这个应该是移动或者联通面试吧* .NET/C#面试题
        * ASP面试题
        * C/C++面试题
        * EJB面试题
        * Hibernate面试题
        * HR面试
        * IQ测试面试题
        * Java/J2EE面试题
        * LINUX/UNIX面试题
        * LoadRunner面试题
        * Mobile开发面试题
        * MySQL面试题
        * Oracle面试题
        * PHP面试题
        * Spring面试题
        * SQL Server面试题
        * Struts面试题
        * Web开发面试题
        * 外企面试
        * 嵌入式开发
        * 应届生面试题
        * 数据库面试题
        * 综合技术面试题
        * 网友面经
        * 网络技术面试题
        * 英语面试题
        * 软件测试题
        * 面试指导