270 likes | 371 Views
The Model Clause. A case study at E.On. Introduction. Oliver.Hayden@eon.com. A little about me, the company I work for, the team I work in and today’s presentation. A brief introduction to the model clause. Example statement:. select empno , ename , sal from emp where deptno = 10
E N D
The Model Clause A case study at E.On
Introduction Oliver.Hayden@eon.com A little about me, the company I work for, the team I work in and today’s presentation.
A brief introduction to the model clause • Example statement: select empno, ename, sal from emp where deptno = 10 MODEL dimension by (empno) measures (ename, sal) rules () / http://docs.oracle.com/cd/B28359_01/server.111/b28313/sqlmodel.htm
create table lod (sid varchar2(20), host varchar2(20), dbrole varchar2(10)); insert into lod values ('orcl1','box1','prmy'); insert into lod values ('orcl1','box3','stby'); insert into lod values ('orcl2','box3','prmy'); insert into lod values ('orcl2','box4','stby'); insert into lod values ('orcl3','box4','prmy'); insert into lod values ('orcl4','box4','stby'); insert into lod values ('orcl4','box5','prmy'); insert into lod values ('orcl5','box2','prmy'); insert into lod values ('orcl5','box1','stby'); insert into lod values ('orcl6','box6','prmy'); insert into lod values ('orcl7','box7','prmy'); insert into lod values ('orcl7','box6','stby'); insert into lod values ('orcl8','box8','prmy'); commit; var n number begin select count(*) into :n from lod; end; /
select clump, sid, host, dbrole, rn from lod model dimension by (sid, host, dbrole) measures (rownum as clump,rownum as rn) rules iterate(10000) until (iteration_number =:n) ( --update clumps for the hosts to the lowest value currently for identical hosts clump[any,host,any]= least ( nvl(min(clump) over (partition by host order by clump rows between unbounded preceding and unbounded following),:n) ) , --update clump for the sids to be the lowest of current clump values clump[any,host,any]= least ( nvl(min(clump) over (partition by sid order by clump rows between unbounded preceding and unbounded following),:n) ) ) /
The previous example was simplified, here we also take into account Oracle version alter table lod add (version varchar2(20) default '10g'); update lod set version ='11g' where sid = 'orcl2'; commit;
select version, clump, sid, host, dbrole, rn from lod MODEL partition by (version) dimension by (sid, host, dbrole) measures (rownum as clump,rownum as rn) rules iterate(10000) until (iteration_number =:n) ( --update clumps for the hosts to the lowest value currently for identical hosts clump[any,host,any]= least ( nvl(min(clump) over (partition by host order by clump rows between unbounded preceding and unbounded following),:n) ) , --update clump for the sids to be the lowest of current clump values clump[any,host,any]= least ( nvl(min(clump) over (partition by sid order by clump rows between unbounded preceding and unbounded following),:n) ) ) order by clump /
Scenario 2: Missing data in a time-series Original requirement arose during a project to investigate whether objects are being used.
with data as (select day as orig_day, value ,day start_dt , nvl(lag(day) over (order by day desc nulls last),day)-1 end_dt from (select trunc(datefield) as day, count(*) as value from dbm_apps.monitor_usage_aud@gfcspw01 group by trunc(datefield)) order by day ) select value as quantity,s2 as time_period from data MODEL partition by (orig_day, start_dt, end_dt) dimension by (0 as z) measures (1 x,value, start_dt s2, end_dt e2) rules sequential order iterate (5) until ( previous(s2[ITERATION_NUMBER]) >= previous(e2[ITERATION_NUMBER]) ) ( x[ITERATION_NUMBER]=ITERATION_NUMBER ,s2[ITERATION_NUMBER]=cv(start_dt)+ITERATION_NUMBER ,e2[ITERATION_NUMBER]=cv(end_dt) ) order by s2, value
Scenario 3: team rota There is a need for our team assignments to be easily visible to both ourselves and our customers. We also need to make sure that resource has been assigned.
create table pp_rota (DUTY VARCHAR2(20) ,PERSON NOT NULL VARCHAR2(20) ,WHEN DATE) /
select when , duty||'.'||person, duty, decode(person,'MISSING',null,person) as real_person from pp_rota model partition by (when) dimension by (duty) measures (person) rules ( person['livebuild']=nvl(person[cv(duty)],'MISSING') ,person['backflush']=nvl(person[cv(duty)],'MISSING') ,person['systest']=nvl(person[cv(duty)],'MISSING') ,person['ep']=nvl(person[cv(duty)],'MISSING') ) order by when, duty