2010-12-14 95 views
3

J'ai une base de données Oracle indexée dans le temps que j'essaie d'interroger par plage de dates. Je veux également faire une réduction des données dans la requête afin que je ne sois pas submergé par trop de données.Filtrage de requête SQL par ligne et par plage de dates

Le stand alone requête date (2352 lignes 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' 

Le stand le long requête de réduction (1017 dans 0.89s):

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

Lorsque je tente de les combiner pour toujours (48 Takes lignes 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) 

Il est évident que je fais quelque chose de fondamentalement mauvais ici, mais je n » Je ne sais pas comment faire une requête par date et réduire les données.

Répondre

0

Merci à la fois 'Narveson' et 'nate c' pour les pointeurs, j'ai finalement compris. Voici la requête (probablement Oracle spécifique) que je suis venu avec:

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

Cette requête renvoie 47 lignes de 0.031s. La requête d'heure d'origine comportait 2352 lignes, ce qui est logique. Le ORAFAQ m'a aidé à obtenir la solution finale.

2

Vous évaluez votre logique de réduction par rapport aux lignes qui ne figurent pas dans la plage de dates choisie.

Appliquez la logique de réduction à une sous-requête contenant votre plage de dates.

PLUS TARD: Voici ce que je voulais dire.

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 
+0

Votre requête ne fonctionne pas dans Oracle qui est la DB je suis coincé en utilisant. Je ne sais pas comment le traduire dans une sous-requête Oracle aime. Je pense que la clause 'group by' est la plus compatible avec DB. – Jason

+0

Désolé. Merci de me le faire savoir. – Narveson

1

Débarrassez-vous de la in

Pourquoi utiliser cette ?:

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

Votre seule condition est mod (rownum, 50)

select * from t where mod(rownum, 50)=0 

la dernière ligne devrait être AND mod(rownnum,50)=0 pas un individu rejoindre avec un in.

+0

On dirait que j'ai changé par erreur mon nom de table 't_ssv_soh_packets0' en 'table' dans mon exemple. J'essaie d'obtenir ces données qui sont toutes stockées dans 't_ssv_soh_packets0'. Votre requête ne fonctionne pas et Oracle semble penser que le problème est avec la ligne de jointure, en particulier avec les 'comme paquets'. Je reçois une erreur "mot-clé manquant". – Jason

+0

Oracle ne prend pas toujours en charge «comme» car il ne s'agit pas d'une plainte ANSI. C'est bon de dire si vous utilisez Oracle dans le post. –

+0

Cette requête: 'select oracle_time à partir de t_ssv_soh_packets0 où mod (rownum, 50) = 0' sélectionne 0 lignes. – Jason

1

Vous pouvez également laisser Oracle choisir un échantillon aléatoire du résultat en appliquant la SAMPLE() clause:

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

sera de retour au hasard 50% pour cent des lignes

+0

Votre commentaire a été tronqué. J'ai obtenu ce qui suit pour travailler: 'SELECT oracle_time FROM t_ssv_soh_packets0 SAMPLE (50) O or oracle_time> = TIMESTAMP '2009-01-01 00:00:00' ET oracle_time <= TIMESTAMP '2009-01-31 00:00:00' 'Cela a retourné 1182 lignes en 0.1s. – Jason

+0

Étrange, j'ai édité mon échantillon de code. Pour une raison quelconque, SO n'aime pas WHERE et SAMPLE() –