Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
create function int_sequence(
p_from int
, p_to int
)
return sys.odcinumberlist
pipelined
is
begin
for i in p_from .. p_to loop
pipe row(i);
end loop;
return;
end;
/
select * from table(int_sequence(1,10))SELECT start_data + LEVEL-1 data
FROM (SELECT TRUNC(SYSDATE-7) start_data, TRUNC(SYSDATE) end_Data FROM DUAL) t
CONNECT BY start_data + LEVEL-1 <= end_Data;
SELECT to_char(time_val,'hh24:mi') as time_val
FROM dual
WHERE
1=2
MODEL
dimension by ( 0 as key )
measures ( trunc(sysdate) as time_val )
-- 1440 mins in Day
rules upsert (
time_val[ for key from 0 to (1-(5/1440)) increment (5/1440) ] = trunc(sysdate) + cv(key)
)
Да тут много разных вариантов может быть, смотря какую задачу решать. Но принцип все равно останется тот же: вначале сформировать последовательность, потом с ней соединить имеющиеся данные.
Для разовых задач наверное проще использовать голый SQL типа иерархического, для часто повторяющихся лучше создать функцию.
это и в 8i работает
with t as
(select sysdate-4 as data from dual union all
select sysdate-2 from dual union all
select sysdate-2 from dual union all
select sysdate from dual)
select d.data,count(t.data)
from t right join (select trunc(sysdate-level+1)as data from dual connect by level<=7) d
on trunc(t.data)=trunc(d.data)
group by d.data
order by d.dataselect d.data,count(t.data)
from (select sysdate-4 as data from dual union all
select sysdate-2 from dual union all
select sysdate-2 from dual union all
select sysdate from dual) t,
(select sysdate-row_number() over (order by rownum)+1 as data
from (select grouping(1) as p
from dual group by cube(1,1,1)) where p!= 1) d
where trunc(t.data(+))=trunc(d.data)
group by d.data
order by d.datawith t as (
select 1 n,trunc(sysdate-5) dt from dual union all
select 2 n,trunc(sysdate-3) dt from dual union all
select 3 n,trunc(sysdate-1) dt from dual
)
select
n
,generator.column_value
,dt+generator.column_value
from
t
,table(cast(multiset(select level from dual connect by level<=t.n) as sys.odcinumberlist)) generator
CREATE OR REPLACE FUNCTION Generate_Date_Sequence( -- Генератор посл-ти дат.
Data_Beg DATE, /*Начальная дата.*/
Data_End DATE, /*Конечная дата.*/
Step CHAR) /*Шаг в последовательности дат: D - день, M - месяц, Y - год.*/
RETURN TDate_Sequence
AS
data_curr DATE;
stp CHAR:= UPPER(Step);
Result TDate_Sequence := TDate_Sequence();
BEGIN
data_curr := TRUNC( Data_Beg,
case stp
when 'D' then 'DD'
when 'M' then 'MM'
when 'Y' then 'YYYY'
end);
-- Сформировать последовательность дат.
WHILE data_curr <= Data_End LOOP
Result.EXTEND;
Result(Result.LAST) := data_curr;
case stp
when 'D' then data_curr := data_curr + 1;
when 'M' then data_curr := ADD_MONTHS(data_curr, 1);
when 'Y' then data_curr := ADD_MONTHS(data_curr, 12);
end case;
END LOOP;
-- Вернуть результат.
RETURN Result;
END Generate_Date_Sequence;
Получение нулевой статистической информации при отсутствии исходных данных