我有时间索引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%行

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top