Salut, je suis confronté à un problème difficile: (. Beaucoup de 100 de millions d'enregistrements de taille)Oracle: Trouver précédent record pour une liste de classement des prévisions
J'ai une table (oracle 9i) des prévisions météorologiques dont la composition ressemble à ceci:
stationid forecastdate forecastinterval forecastcreated forecastvalue
---------------------------------------------------------------------------------
varchar (pk) datetime (pk) integer (pk) datetime (pk) integer
où:
stationid
fait référence à l'une des nombreuses stations météorologiques qui peuvent créer une prévision;forecastdate
fait référence à la date à laquelle la prévision est pourforecastinterval
fait référence à l'heure dans leforecastdate
pour les prévisions (0-23) (par date pas de temps.).forecastcreated
se réfère à l'heure à laquelle la prévision a été faite, peut être plusieurs jours à l'avance.forecastvalue
fait référence à la valeur réelle de la prévision (comme son nom l'indique.)
Je dois déterminer pour une donnée stationid
et une paire donnée forecastdate
et forecastinterval
, les enregistrements où un forecastvalue
incréments plus d'un nombre nominal (disons 500). Je vais montrer un tableau de la condition ici:
stationid forecastdate forecastinterval forecastcreated forecastvalue
---------------------------------------------------------------------------------
'stationa' 13-dec-09 10 10-dec-09 04:50:10 0
'stationa' 13-dec-09 10 10-dec-09 17:06:13 0
'stationa' 13-dec-09 10 12-dec-09 05:20:50 300
'stationa' 13-dec-09 10 13-dec-09 09:20:50 300
Dans le scénario ci-dessus, je voudrais retirer le troisième enregistrement. C'est le record où la valeur de la prévision a augmenté d'un montant nominal (disons 100).
La tâche se révèle être très difficile en raison de la taille de la table (beaucoup de 100s de millions d'enregistrements.) Et si long à la fin (si longtemps en fait que ma requête n'a jamais retourné.)
Voici ma tentative à ce jour pour saisir ces valeurs:
select
wtr.stationid,
wtr.forecastcreated,
wtr.forecastvalue,
(wtr.forecastdate + wtr.forecastinterval/24) fcst_date
from
(select inner.*
rank() over (partition by stationid,
(inner.forecastdate + inner.forecastinterval),
inner.forecastcreated
order by stationid,
(inner.forecastdate + inner.forecastinterval) asc,
inner.forecastcreated asc
) rk
from weathertable inner) wtr
where
wtr.forecastvalue - 100 > (
select lastvalue
from (select y.*,
rank() over (partition by stationid,
(forecastdate + forecastinterval),
forecastcreated
order by stationid,
(forecastdate + forecastinterval) asc,
forecastcreated asc) rk
from weathertable y
) z
where z.stationid = wtr.stationid
and z.forecastdate = wtr.forecastdate
and (z.forecastinterval =
wtr.forecastinterval)
/* here is where i try to get the 'previous' forecast value.*/
and wtr.rk = z.rk + 1)
Avez-vous des indices pertinents sur la table? Si c'est vrai, que sont-ils? –
Tous les champs de clé primaire sont indexés. –