我有一个索引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)
显然我在这里做了一些根本性的错误,但我不知道如何按日期查询并减少数据。
答案 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帮助我找到最终解决方案。