MODEL. SQL высший пилотаж. Часть 2. Сложные последовательности.

добавлено: 03 июл 15
понравилось:0
просмотров: 3170
комментов: 0

теги:

Автор: Myp3_u_K

Авторский курс. SQL от новичка до профессионала. Бесплатное вводное занятие. Сертификат. Записывайся!
Прокачаю до уровня БОГ!


Используем Model для создания массивов
-- создание одномерного массива
SELECT *
FROM dual
    MODEL DIMENSION BY (0 as т1)
    MEASURES (cast(dummy as varchar2(20)) as ct) 
    RULES (        
        ct[0] = '1',
        ct[1] = '2',       
        ct[1] = '3',
        ct[2] = '4',
        ct[3] = '5'
    ) order by 1;
--Т1	CT
--0	1
--1	3
--2	4
--3	5



-- создание двумерного массива
SELECT *
FROM dual
    MODEL DIMENSION BY (0 as nx, 1 as ny)
    MEASURES (cast(dummy as varchar2(20)) as ct) 
    RULES (        
        ct[0,0] = '111',
        ct[0,1] = '111',       
        ct[1,1] = '112',
        ct[2,2] = '211',
        ct[3,3] = '331'
    ) order by 1;
--  NX	NY	CT
--	0	1	111
--	0	0	111
--	1	1	112
--	2	2	211
--	3	3	331


-- использование итератора
-- простейший пример
select
  m1 ,
  AA
from
  dual
model
  dimension by ( 0 as m1 )
  measures     ( cast( 'A ' as varchar2(100) ) as AA )
  rules
    ITERATE (35)
    ( aa[0] = aa[0] || 'A' )
-- 	M1	AA
--	0	A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


-- итератор в качестве счетчика, более сложный пример , теперь с конструкцией until наращиваем итерацию пока aa[0] не будет равно 'AAAAAAAA'
select
  m1 ,
  AA
from
  dual
model
  dimension by ( 0 as m1 )
  measures     ( cast( 'A' as varchar2(100) ) as AA )
  rules
    ITERATE (35) UNTIL aa[0] = 'AAAAAAAA' 
    ( aa[0] = aa[0] || 'A' );
--    	M1	AA
--	0	AAAAAAAA


--- аналогичный пример но используем команды PREVIOUS() - перед значение и ITERATION_NUMBER - номер итерации
select
  m1 , AA
from  dual model
  dimension by ( 0 as m1 )
  measures     ( cast( 'A' as varchar2(100) ) as AA )
  rules
    ITERATE (15) UNTIL PREVIOUS(AA[0]) = 'AA0A1A2A3' -- пока предыдущее значение AA[0] 
    ( aa[0] =aa[0]|| 'A'||ITERATION_NUMBER );
--   	M1	AA
--	0	AA0A1A2A3A4


-- пример итерации от 0 до 5
select
  m1 , AA
from  dual model
  dimension by ( 0 as m1 )
  measures     ( cast( 'A' as varchar2(100) ) as AA )
  rules upsert
    ITERATE (5) -- пока предыдущее значение AA[0] 
    ( aa[ITERATION_NUMBER] = 'A'||ITERATION_NUMBER *10);
--  M1	AA
--	0	A0
--	1	A10
--	2	A20
--	3	A30
--	4	A40



-- сложная последовательность в которой следующий номер произведение двух предыдущих ,
-- с ограничением результат более 8000
SELECT   m1 , AA
from  dual model
MODEL DIMENSION BY (0 as m1)
    MEASURES (0 as aa)
    RULES 
    ITERATE (12) UNTIL (aa[iteration_number] > 8000) (
        aa[iteration_number] =
            CASE iteration_number
                WHEN 0 THEN 1
                WHEN 1 THEN 2                  
                ELSE aa[iteration_number - 1] * aa[iteration_number-2]
            END ); 

-- 	M1	AA
--	0	1
--	1	2
--	2	2
--	3	4
--	4	8
--	5	32
--	6	256
--	7	8192


приведу так же пример с партицированием данных
-- пример с партицированием
select color, iter
from (select 'color'||level color from dual connect by level < 4) tab
model
  partition by ( color )
  dimension by ( 0 as key )
  measures     ( cast( null as varchar2(50) ) as iter )
  rules iterate( 10 )
    ( iter[0] = iter[0] || to_char(iteration_number) || ' ' );

        m1           aa
--	color3	0 1 2 3 4 5 6 7 8 9 
--	color1	0 1 2 3 4 5 6 7 8 9 
--	color2	0 1 2 3 4 5 6 7 8 9 


продолжение далее

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии