3

我有一个时间索引的 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' 

支持减少查询(0.89s 内 1017 个):

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

4 回答 4

2

您正在根据不在您选择的日期范围内的行评估您的缩减逻辑。

将缩减逻辑应用于包含您的日期范围的子查询。

稍后:这就是我的意思。

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
于 2010-12-14T23:41:45.193 回答
1

您还可以通过应用SAMPLE()子句让 Oracle 从结果中选择一个随机样本:

选择 oracle_time
从 t_ssv_soh_packets0
在哪里 ...
样品(50)

将随机返回 50% 的行

于 2010-12-15T21:41:22.513 回答
1

摆脱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.

于 2010-12-14T23:57:55.353 回答
0

Thanks to both 'Narveson' and 'nate c' for the pointers I finally figured it out. Here is the (probably Oracle specific) query that I came up with:

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

This query returns 47 rows in 0.031s. The original time query had 2352 rows so that makes sense.

The ORAFAQ helped me get to the final solution.

于 2010-12-15T20:48:05.920 回答