如下A表  记录用户每次动作  mobile           time           action          re_value(返回值)
  13631521739     20120915       1(开通)       0(成功)
  15143728915     20120915       1(开通)       0(成功)
  15143728915     20120915       1(开通)       2(重复开通)
  15143728915     20120918       2(注销)       0(成功)
  13631521739     20120925       2(注销)       0(成功)
1. 查询在开通四天之内又注销的用户2.查询在开通四天后又注销的用户   

解决方案 »

  1.   

    不知道你是不是想要这样的:
    WITH test (mobile, TIME, ACTION, re_value)
     AS ( 
     SELECT  '13631521739', '20120915' ,'1', '0'
     UNION ALL 
     SELECT  '15143728915', '20120915' ,'1', '0'
     UNION ALL 
     SELECT  '15143728915', '20120915' ,'1', '2'
     UNION ALL 
     SELECT  '15143728915', '20120918' ,'2', '0'
     UNION ALL 
     SELECT  '13631521739', '20120925' ,'2', '0'
     )
     SELECT mobile,MAX(CASE WHEN ACTION=1 AND re_value=0 THEN time END) [开通时间],MAX(CASE WHEN ACTION=2 THEN time END) [注销时间],
     CASE WHEN DATEDIFF(dd,MAX(CASE WHEN ACTION=1 AND re_value=0 THEN time END),MAX(CASE WHEN ACTION=2 THEN time END))<4 THEN '4天内注销' END ,
     CASE WHEN DATEDIFF(dd,MAX(CASE WHEN ACTION=1 AND re_value=0 THEN time END),MAX(CASE WHEN ACTION=2 THEN time END))>4 THEN '4天后注销' END 
     FROM test 
     GROUP BY mobile
     
     /*
     mobile      开通时间     注销时间               
     ----------- -------- -------- --------- ---------
     13631521739 20120915 20120925 NULL      4天后注销
     15143728915 20120915 20120918 4天内注销     NULL
     警告: 聚合或其他 SET 操作消除了 Null 值。
     
     (2 行受影响)
     */
      

  2.   

    -->测试数据
    declare  @test table (mobile varchar(11), TIME datetime, ACTION varchar(1), re_value varchar(1))
    insert into @test
     select  '13631521739', '20120915' ,'1', '0'
     union all 
     select  '15143728915', '20120915' ,'1', '0'
     union all 
     select  '15143728915', '20120915' ,'1', '2'
     union all 
     select  '15143728915', '20120918' ,'2', '0'
     union all 
     select  '13631521739', '20120925' ,'2', '0'
     
    -->测试查询
     select 
     case when datediff(dd,max(case when ACTION=1 and re_value=0 then time end),max(case when ACTION=2 then time end))<4 then'4天内注销' else '4天后注销' end, 
     mobile
     from @test 
     group by mobile -->测试结果
    ----------  ------------------------
    /*
    (无列名)          mobile
    4天后注销 13631521739
    4天内注销 15143728915
    */
      

  3.   

    select DISTINCT p.mobile from phone p ,phone hwhere p.action=1 AND  h.action=2 AND  (h.time-p.time)<4 and h.mobile=p.mobile
      

  4.   


    oracle  中没有datediff 函数的这种用法吧
      

  5.   

    晕,你的是oracle?这里是SQLServer专区,肯定用的是T-SQL语法拉,我的你试过没?我的不知道oracle行不行
      

  6.   

    这个是SQL的写法,oracle的问题可以转到相关专区