现在我有个表 table1 , 
记录一个月内,每个号码的漫游地
假设针对个号码每天产生一条记录
call_num    address call_time 
号码         地域   时间 
132          深圳  20080101 
123          北京  20080101 
123          北京  20080102 
123          北京  20080102 
155          广州  20080112 
132          上海  20080112 
145          上海  20080114 
145          上海  20080114 
123          广州  20080114 
132          广州  20080114 
155          广州  20080114 
155          广州  20080117 
123          广州  20080117 
132          北京  20080118 
123          深圳  20080118 
123          深圳  20080118 
123          北京  20080122 
132          北京  20080122 
155          上海  20080122 
155          上海  20080123  
155          上海  20080124 
155          上海  20080130  
155          上海  20080131 
145          苏州  20080131  
123          广州  20080131 
现在要求每个号码在每月最后的出现地点和该号码在该月早到达该地的时间
(假设一个号码一个最多在两个地方出现) 
例如号码 155 本月的最后一天是上海,并且是在22进入上海的那么可能的数据就是
 
call_num    last_area      last_area_time
号码         本月最后出现地点     本月到达最新漫游地的起始时间 
 155          上海              20080122请问这个  sql 如何构造啊

解决方案 »

  1.   

    with last_area as(
      select *
        from (select t.*, row_number() over(partition by call_num order by call_time desc) rn from tbc_call t)
       where rn = 1)
        select t.call_num, t.address as last_area, min(t.call_time) as last_area_time
          from tbc_call t
         inner join last_area on t.call_num = last_area.call_num
                             and t.address = last_area.address
         group by t.call_num, t.address;输出结果:
    155 shanghai 1/22/2008
    123 guangzhou 1/14/2008
    145 suzhou 1/31/2008
    132 beijing 1/18/2008
      

  2.   

    先若弱 问一句 啊
    with  是oracle 中sql吗?
    什么意思啊?
      

  3.   

    是oracle的10G下肯定好用,但具体从什么版本开始支持的就叫不准了,
    你把with中间的sql拿出来用括号括起来替换到下面引用last_area的地方再起个别名叫last_area也同样好用,
    你上网搜下oracle with as就知道了
      

  4.   

    那个sql好用不 逻辑有问题没?