Фильтрация запроса SQL по ряду и по диапазону дат

StackOverflow https://stackoverflow.com/questions/4445333

  •  10-10-2019
  •  | 
  •  

Вопрос

У меня есть время, индексированное Oracle DB, которое я пытаюсь запрашивать диапазон дат. Я также хочу сделать снижение данных в запросе, чтобы я не перегружен слишком большим количеством данных.

Запрос даты отдельно (2352 ряда в 0,203 с):

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 в 0,89 с):

select oracle_time from t_ssv_soh_packets0
where (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)

Когда я пытаюсь объединить их, это требуется вечно (48 рядов в 32,547 с):

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

Благодаря «Нарвесону» и «Нейт С» за указатели, которые я наконец -то понял. Вот (вероятно, Oracle Special) запрос, который я придумал:

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

Этот запрос возвращает 47 строк в 0,031 с. Первоначальный запрос времени имел 2352 ряда, так что это имеет смысл.

А Орафак помог мне добраться до окончательного решения.

Другие советы

Вы оцениваете свою логику сокращения по рядам, которые не находятся в выбранном вами диапазоне дат.

Примените логику сокращения к подзаднечке, содержащему диапазон дат.

Позже: вот что я имел в виду.

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