Привет я столкнулся с трудной проблемой: (. Много 100 миллионов записей в размере)Oracle: Найти предыдущий рекорд ранжированный список прогнозов
У меня есть таблица (Oracle 9i) прогнозов погоды чей макияж выглядит следующим образом:
stationid forecastdate forecastinterval forecastcreated forecastvalue
---------------------------------------------------------------------------------
varchar (pk) datetime (pk) integer (pk) datetime (pk) integer
где:
stationid
относится к одному из многочисленных метеорологических станций, которые могут создать прогноз;forecastdate
относится к дате прогноз дляforecastinterval
относится к часу вforecastdate
для прогноза (0 - 23) (дата не только время.).forecastcreated
относится ко времени прогноза, может быть много дней заранее.forecastvalue
относится к фактическому значению прогноза (как следует из названия.)
нужно определить для данного stationid
и заданной forecastdate
и forecastinterval
пары, в записи, в которых forecastvalue
приращения больше номинальное число (скажем, 500). Я покажу таблицу состояния здесь:
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
В приведенном выше сценарии я хотел бы снять третью пластинку. Это рекорд, когда значение прогноза увеличилось на номинальную (скажем, 100) сумму.
задача оказывается очень трудно из-за огромного размера таблицы (много 100s миллионов записей.) И так долго, чтобы закончить (так долго, что мой запрос никогда не вернулся.)
Вот моя попытка до сих пор, чтобы захватить эти значения: предложение
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)
Есть ли у вас соответствующие индексы на столе? Если так, то кто они? –
Все поля первичного ключа индексируются. –