题
我有时间索引Oracle DB,我试图按日期范围查询。我还想在查询中减少数据,因此我不会对数据不知所措。
独立日期查询(0.203s的2352行):
select oracle_time from t_ssv_soh_packets0
where oracle_time >= TIMESTAMP '2009-01-01 00:00:00'
AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00'
沿着还原查询(1017 in 0.89s)的支架:
select oracle_time from t_ssv_soh_packets0
where (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)
当我尝试将它们结合起来时,它需要永远(32.547中的48行):
select oracle_time from t_ssv_soh_packets0
where oracle_time >= TIMESTAMP '2009-01-01 00:00:00'
AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00'
AND (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)
显然,我在这里从根本上做错了什么,但是我不知道如何按日期查询并减少数据。
解决方案 4
感谢“ Narveson”和“ Nate C”的指示,我终于弄清楚了。这是我想到的(可能是甲骨文的)查询:
select oracle_time from t_ssv_soh_packets0 where oracle_time >= TIMESTAMP '2009-01-01 00:00:00' AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00' group by oracle_time, rownum having mod(rownum, 50)=0
此查询在0.031s中返回47行。原始的时间查询有2352行,这很有意义。
这 Orafaq 帮助我达到了最终解决方案。
其他提示
您正在评估不在您选择的日期范围内的行的还原逻辑。
将还原逻辑应用于包含您日期范围的子查询。
后来:这就是我的意思。
select oracle_time from (
select oracle_time, rownum as limited_row_num
from t_ssv_soh_packets0
where oracle_time >= TIMESTAMP '2009-01-01 00:00:00'
AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00'
) as time_range
where mod(limited_row_num,50) = 0
摆脱 in
为什么要使用这个?:
select oracle_time from t_ssv_soh_packets0
where (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)
您唯一的条件是mod(Rownum,50)
select * from t where mod(rownum, 50)=0
最后一行应该是 AND mod(rownnum,50)=0
没有一个自我加入 in
.
您也可以让Oracle通过应用程序选择结果。 样本() 条款:
SELECT oracle_time FROM t_ssv_soh_packets0 WHERE ... SAMPLE(50)
将随机返回行的50%行
不隶属于 StackOverflow