用分析函数 row_number() over(partition by ... order 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; 估计会跑不动
数据量大的话最好建相应的索引,创建两个对应的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) 这样把数据集缩小后,应该效率会提高点,因为有索引,单个数据的效率用分组应该会高点
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;
估计会跑不动
在ORACLE里确实很难跑,不过我的目的是在HIVE里面跑,所以应该还是可以的。但是需要自己在HIVE里实现dense_rank() over函数的功能,也是个麻烦事,谢谢
一个专门返回最小那个月
一个返回最大的那个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)
这样把数据集缩小后,应该效率会提高点,因为有索引,单个数据的效率用分组应该会高点
可以按时间段进行分区,按照分区的时间查询,然后union all连接。