sqlクエリを行および日付範囲ごとにフィルタリングします
質問
日付の範囲でクエリしようとしているOracle DBのインデックス付き時間があります。また、クエリでデータ削減を行いたいので、あまりにも多くのデータに圧倒されません。
スタンドアロンの日付クエリ(0.203秒の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.89で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
ポインターの「ナルベソン」と「ネイト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 最終的な解決策に到達するのを助けてくれました。
他のヒント
選択した日付範囲にない行に対する削減ロジックを評価しています。
削減ロジックを日付範囲を含むサブクエリに適用します。
後で:これが私が意味したことです。
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%をランダムに返します