表名c_data_01。表结构:
uuid c_id c_time a b c
1 0001 2013-3-6 00:01:00 1 1 1
2 0002 2013-3-6 00:00:00 1 1 1
3 0001 2013-3-6 00:01:30 1 1 1
4 0002 2013-3-6 00:01:35 1 1 1
其中uuid为主键,自增。c_id和c_time可以唯一确定一条数据。c_id大概有1万,c_time为时间格式。每个c_id大概每半分钟就有一条数据,时间无规律。数据量是有点大,已使用分区表(先以c_time天分区,再对c_id进行哈希分区)。a、b、c等为其它不重要字段。
问题一:
给定一个c_id和一个日期,查出该天内每个小时内的一条数据,即共有24条数据,每个小时一条。该条数据可以是小时内的随机数据,也可以是小时内最大时间对应的数据。
下面的语句是查询最大时间的,但速度有点慢。能否不用最大时间或者有没有更好查询的方法?
select *
from c_data_01
where c_id = '0001'
and c_time in
(select max(collect_time)
from c_data_01
where c_id = '0001'
and c_time >=
to_date('2013-3-6 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
and c_time<
to_date('2013-3-7 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
group by trunc(c_time , 'hh24'))
直接选取24条数据,速度还好。但又不能保证每小时有一条数据。
select *
from c_data_01
where c_id = '0001'
and c_time >=
to_date('2013-3-6 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
and c_time<
to_date('2013-3-7 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
and rownum < 25
问题二:
如果要将每个c_id每个小时取出一条数据(无要求、随机什么的都可以)放入另外一张p_data表中。
若用最大时间或随机取数据,同样的问题,效率太低。有没有改进的方法或者其他更好的办法?
/*小时内最大时间*/
insert into p_data
select a1.c_id,a1.c_time,a1.a,a1.b,a1.c
from c_data_01 a1,
(select c_id, max(c_time) c_time
from c_data_01
where c_time >=
to_date('2013-3-6 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
and c_time <
to_date('2013-3-7 00:00:00', 'yyyy-mm-dd hh24:mi:ss')