日期:2014-05-17  浏览次数:20886 次

求高手看看这个SQL该怎么写
本帖最后由 allenpony 于 2013-06-19 17:21:14 编辑
有一个表testtable,有如下字段
active_time,inactive_time,seq_id,area_id
表中有如下数据
active_time             inactive_time           seq_id          area_id
2008/10/22 16:22:57 2008/10/22 17:22:57 153991356 43993
2008/10/22 16:22:57 2009/9/1         153991356 90032
2008/10/22 16:22:57 2008/11/29 11:14:12 153991356 90081
2008/10/22 16:22:57 2008/11/29 11:14:13 153991356 42116
2008/10/22 16:22:57 2008/11/29 11:14:13 153991356 44336
2008/10/22 17:22:58 2008/12/1         153991356 43993
2010                    2037                    153991356 43993

现在要找出一个seq_id对应的active_time最小的那个月(200810)的数据,同一个seq_id,同一个area_id对应多条数据的时候,取inactive_time最大的。比如43993,要求是2008/12/1那条数据,最后的结果应该是
active_time             inactive_time           seq_id          area_id
2008/10/22 16:22:57 2009/9/1         153991356 90032
2008/10/22 16:22:57 2008/11/29 11:14:12 153991356 90081
2008/10/22 16:22:57 2008/11/29 11:14:13 153991356 42116
2008/10/22 16:22:57 2008/11/29 11:14:13 153991356 44336
2008/10/22 17:22:58 2008/12/1         153991356 43993
另外该表有其他字段,且数据量有上亿,因此不可用group by 的方式。

------解决方案--------------------
select t.active_time, t.inactive_time, t.seq_id, t.area_id
  from (select t.*,
               row_number() over(partition by seq_id, t.area_id order by t.inactive_time desc) rn
          from (select t.*,
                       dense_rank() over(partition by seq_id order by to_char(t.active_time, 'yyyymm')) dr
                  from testtable t) t
         where t.dr = 1) t
 where t.rn = 1;



估计会跑不动