Filtrado de consulta SQL por fila y por rango de fechas
Pregunta
Me es indexada base de datos Oracle, que estoy tratando de consulta por rango de fechas. También quiero hacer la reducción de datos en la consulta, así que no se dejen confundir con demasiados datos.
La consulta independiente fecha (2352 filas en 0.203s):
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'
El stand junto consulta reducción (1.017 en 0.89s):
select oracle_time from t_ssv_soh_packets0
where (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)
Cuando intento de combinarlos que se necesita para siempre (48 filas en 32.547s):
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)
Es obvio que estoy haciendo algo fundamentalmente equivocado aquí, pero no sé de qué otra manera tanto consulta por fecha y reducir los datos.
Solución 4
Gracias a los dos 'Narveson' y 'c Nate' para los punteros, finalmente, lo he descubierto. Aquí está el (probablemente Oracle específica) consulta que se me ocurrió:
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
Esta consulta devuelve 47 filas en 0.031s. El tiempo de consulta original tenía 2352 filas por lo que tiene sentido.
El ORAFAQ me ayudó a llegar a la solución final.
Otros consejos
Se está evaluando la lógica de reducción frente a las filas que no están en el intervalo de fechas seleccionado.
Aplicar la lógica reducción a una sub consulta que contiene el intervalo de fechas.
A MÁS: Esto es lo que quería decir.
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
deshacerse de los in
¿Por qué utilizar esto:?
select oracle_time from t_ssv_soh_packets0
where (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)
Su única condición es mod (rownum, 50)
select * from t where mod(rownum, 50)=0
última línea debe ser AND mod(rownnum,50)=0
no unirse a un auto con un in
.
También puede dejar que Oracle elegir una muestra aleatoria de los resultados mediante la aplicación de la muestra () cláusula :
SELECT oracle_time FROM t_ssv_soh_packets0 WHERE ... SAMPLE(50)
Volveremos al azar 50% por ciento de las filas