本帖最后由 allenpony 于 2013-06-19 17:21:14 编辑

解决方案 »

  1.   

    用分析函数 row_number() over(partition by ... order by ...)
      

  2.   

    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;
    估计会跑不动
      

  3.   


    在ORACLE里确实很难跑,不过我的目的是在HIVE里面跑,所以应该还是可以的。但是需要自己在HIVE里实现dense_rank() over函数的功能,也是个麻烦事,谢谢
      

  4.   

    数据量大的话最好建相应的索引,创建两个对应的function
    一个专门返回最小那个月
    一个返回最大的那个select a.seq_id,b.seq_id,fun1(a.seq_id),fun2(area_id)
    from testtable a
    where rowid=(select min(rowid) from testtable b where a.seq_id=b.seq_id
    and a.area_id=b.area_id)
    这样把数据集缩小后,应该效率会提高点,因为有索引,单个数据的效率用分组应该会高点
      

  5.   

    应该是分区做操作,在优化sql服务器也是承受不了的。
    可以按时间段进行分区,按照分区的时间查询,然后union all连接。