2008-10-06 14:57:58

Вытаскиваем из оракла данные по периоду

Про работу В мемориз Oracle

В связи с появлением проблемы 6-го дня (см. предыдущий пост) вытащить период (данные за определенный промежуток вермени с шагом например в день), у которого есть дата начала и дата конца, средствами php становится невозможно, поэтому пришлось выдумывать хитрую, но 100% рабочую схему в Oracle.

Начальная ситуация: статистика, есть таблица с периодами (periods) и таблица со статистическими данными, которые расположены по датам (несколько записей за день), но не всегда за все даты есть данные или требуется отобразить период, который еще не закончился, но показать нужно от начала до конца с нулями за даты, которые еще не прошли.

 select d.dt, sum(<здесь все что нужно выбрать из таблицы статистики>)
 from
 ( 
   SELECT (TRUNC(( select databegin from periods where period_id= '<идентификатор периода>' ), 'DD') + ROWNUM -1) as dt  
   FROM all_objects WHERE ROWNUM <= ( select trunc(dataend) - trunc(databegin) from periods where period_id= '<идентификатор периода>' ) + 1
) d
left join 
( <таблица или несколько статистики> ) e
on d.dt=trunc(e.date)
group by d.dt


Теперь подробно по строчкам.

  1. выбираем дату (которую создадим) и все что нужно (например сумму) из статистики.
  2. думаю понятно.
  3. тоже понятно.
  4. формируем даты (отталкиваемся от дня даты начала периода и прибавляем к нему текущий номе ряда минус 1 чтоб начать с даты начала).
  5. выбираем из таблицы, в которой есть достаточное количество рядов (это может быть любая доступная таблица), и выбираем количество рядов равное количеству дней от начала до конца периода.
  6. обзываем табличку для удобства.
  7. имеено left join чтоб прицепить все созданные даты к тому что есть в статистике.
  8. обязательно в скобках особенно есть сбор из нескольких таблиц, иначе в результате могут получаться не все даты из сформированных, а только те для которых есть статистика.
  9. связываем таблицы по дате.
  10. и группируем чтоб получить значения (суммы) по дням а не чаще.

Таким образом создаеся нужный диапазон дат (дней) и к нему привязывается информация из статистики, заполненные с любым шагом.

В случае, если не требуется определять даты начала и клнца периода, а все заранее известно, то сформировать таблицу дат с нужным количеством рядов еще проще, можно использовать CUBE или еще что-то в зависимости от длинны диапазона, как это сделать ответит гугль.

Не знаю насколько частро встречается подобная ситуация, но думаю кому-нибудь окажется полезным, да и себе в мемориз