按行和按日期范围过滤SQL查询

时间:2010-12-14 23:28:10

标签: sql oracle date reduce

我有一个索引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.547s中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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的自我加入。

答案 2 :(得分:1)

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

SELECT oracle_time 
FROM t_ssv_soh_packets0
WHERE ...
SAMPLE(50)

将随机返回50%的行数

答案 3 :(得分:0)

感谢'Narveson'和'nate c'指针,我终于弄明白了。以下是我提出的(可能是Oracle特定的)查询:

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.031秒的形式返回47行。原始时间查询有2352行,所以这是有意义的。

ORAFAQ帮助我找到最终解决方案。