Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9230
AmKad
Заинтриговал. Третий час с моделью бьюсь, победить не могу: cyclic/acyclic.


SELECT  VAL
  FROM  DUAL
  MODEL
    DIMENSION BY(0 ID)
    MEASURES(
             0 TEMP_VAL,
             0 VAL
             )
    RULES ITERATE(&1)
      (
       TEMP_VAL[FOR ID FROM 0 TO ITERATION_NUMBER + 1 INCREMENT 1] = CASE
                                                                       WHEN VAL[ITERATION_NUMBER] - (ITERATION_NUMBER + 1) < 0
                                                                         THEN VAL[ITERATION_NUMBER] + ITERATION_NUMBER + 1
                                                                       ELSE VAL[ITERATION_NUMBER] - (ITERATION_NUMBER + 1)
                                                                     END,
       VAL[ITERATION_NUMBER + 1] = CASE
                                     WHEN VAL[ITERATION_NUMBER] - (ITERATION_NUMBER + 1) < 0
                                       THEN TEMP_VAL[0]
                                     WHEN COUNT(
                                                CASE TEMP_VAL
                                                  WHEN VAL THEN 1
                                                END
                                               )[ANY] = 1
                                       THEN VAL[ITERATION_NUMBER] + ITERATION_NUMBER + 1
                                       ELSE TEMP_VAL[0]
                                   END
      )
/
Enter value for 1: 20
old   9:     RULES ITERATE(&1)
new   9:     RULES ITERATE(20)

       VAL
----------
         0
         1
         3
         6
         2
         7
        13
        20
        12
        21
        11

       VAL
----------
        22
        10
        23
         9
        24
         8
        25
        43
        62
        42

21 rows selected.

SQL> 


SY.
12 окт 18, 15:35    [21702661]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1419
andrey_anonymous,

спасиб, примерно етого я и хотел добится

для мене не просто, буду осознавать

....
stax
12 окт 18, 15:43    [21702680]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16909
Stax
буду осознавать

Из трюков там только смешанное использование dimension - как индекса последовательности Ai и как кэша встреченных значений последовательности t, собственно поэтому пришлось оборачивать в динамическое представление - отфильтровать Ai is not null...
12 окт 18, 15:52    [21702697]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5149
Вячеслав Любомудров
Все проще -- надо требовать
Не совсем понятно к чему это ёрничанье.
На Stack Overflow можно удалять свои темы, посты или редактировать их как угодно.
И ничего - живет ресурс. И что удивительно без взаимных тычков.
Диктатура имеет смысл только в определенных сообществах.
12 окт 18, 16:01    [21702712]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5149
Stax
текущую где-то запоминать
Очередная вариация
select i, x
from dual
model ignore nav
dimension by (0 i)
measures (0 x, 0 tmp)
rules iterate(11)
(
 tmp[i<iteration_number]=x[iteration_number-1]-iteration_number,
 x[iteration_number]=x[iteration_number-1]+iteration_number*decode(sign(tmp[0])*sign(min(abs(x-tmp))[i<iteration_number]),1,-1,1)
)
12 окт 18, 16:25    [21702732]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16909
dbms_photoshop
Stax
текущую где-то запоминать
Очередная вариация[/src]

Красиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.
12 окт 18, 16:43    [21702743]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5149
andrey_anonymous,

Да, решение с "душком".

PS.
Можно учитывать заполненность первой строки и уменьшить число итераций на одну,
при этом убрав ignore nav в предложенных вариантах с минимальными изменениями.
12 окт 18, 16:48    [21702750]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16909
dbms_photoshop
Можно учитывать заполненность первой строки

Еще можно попробовать учесть тот факт, что минимальное возможное значение i-го элемента последовательности растет, что теоретисски допускает сокращение размера кэша значений.
min(Ai) over(order by i rows 10 preceding) m_i
12 окт 18, 17:02    [21702760]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16909
dbms_photoshop
Да, решение с "душком".


Предлагаю перевести конкурс с критерия "многабукфф" в более традиционное русло:

Попробовал "вариацию" на 100000 итерациях - что-то оно "ушло в себя".
Вариант Соломона (с двойной итерацией) тоже.
Мой вариант уложился в 3 секунды.
SQL> 
set timing on
with t1 as (
select i, Ai
from ( select * from dual
        model ignore nav
        dimension by (0 i)
        measures (0 Ai, 0 t)
        rules iterate (100000)
        ( Ai[iteration_number] = Ai[iteration_number-1]
                               + iteration_number
                               * case when t[Ai[iteration_number-1]-iteration_number] >0
                                        or Ai[iteration_number-1]-iteration_number <= 0
                                    then 1
                                  else -1
                                  end
        , t[Ai[iteration_number]] = 1
        )
) where Ai is not null
)
select count(*), sum(Ai) from t1
;
  COUNT(*)    SUM(AI)
---------- ----------
    100000 8643985072
Executed in 2,831 seconds

SQL>  
12 окт 18, 17:13    [21702772]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5149
andrey_anonymous,

Трюк с nested cells не оставляет никаких шансов прочим проверкам.
12 окт 18, 17:20    [21702783]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9230
andrey_anonymous
Красиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.


Ну мое решение делает тоже самое. Без размножения:

SELECT  ID,
        VAL
  FROM  DUAL
  MODEL
    DIMENSION BY(0 VAL)
    MEASURES(
             0 ID,
             0 PREV_VAL
             )
    RULES ITERATE(&1)
      (
       PREV_VAL[0] = CASE
                       WHEN PREV_VAL[0] - (ITERATION_NUMBER + 1) < 0
                         THEN PREV_VAL[0] + ITERATION_NUMBER + 1
                       WHEN ID[PREV_VAL[0] - (ITERATION_NUMBER + 1)] IS NOT NULL
                         THEN PREV_VAL[0] + ITERATION_NUMBER + 1
                       ELSE PREV_VAL[0] - (ITERATION_NUMBER + 1)
                     END,
       ID[PREV_VAL[0]] = ITERATION_NUMBER + 1
      )
/
Enter value for 1: 10
old  10:     RULES ITERATE(&1)
new  10:     RULES ITERATE(10)

        ID        VAL
---------- ----------
         0          0
         1          1
         2          3
         3          6
         4          2
         5          7
         6         13
         7         20
         8         12
         9         21
        10         11

11 rows selected.

SQL> 


Производительность:

SQL> with t1 as (
  2  select i, Ai
  3  from ( select * from dual
  4          model ignore nav
  5          dimension by (0 i)
  6          measures (0 Ai, 0 t)
  7          rules iterate (100000)
  8          ( Ai[iteration_number] = Ai[iteration_number-1]
  9                                 + iteration_number
 10                                 * case when t[Ai[iteration_number-1]-iteration_number] >0
 11                                          or Ai[iteration_number-1]-iteration_number <= 0
 12                                      then 1
 13                                    else -1
 14                                    end
 15          , t[Ai[iteration_number]] = 1
 16          )
 17  ) where Ai is not null
 18  )
 19  select count(*), sum(Ai) from t1
 20  ;

  COUNT(*)    SUM(AI)
---------- ----------
    100000 8643985072

Elapsed: 00:00:04.39
SQL> WITH T AS (
  2             SELECT  ID,
  3                     VAL
  4               FROM  DUAL
  5               MODEL
  6                 DIMENSION BY(0 VAL)
  7                 MEASURES(
  8                          0 ID,
  9                          0 PREV_VAL
 10                          )
 11                 RULES ITERATE(&1)
 12                   (
 13                    PREV_VAL[0] = CASE
 14                                    WHEN PREV_VAL[0] - (ITERATION_NUMBER + 1) < 0
 15                                      THEN PREV_VAL[0] + ITERATION_NUMBER + 1
 16                                    WHEN ID[PREV_VAL[0] - (ITERATION_NUMBER + 1)] IS NOT NULL
 17                                      THEN PREV_VAL[0] + ITERATION_NUMBER + 1
 18                                    ELSE PREV_VAL[0] - (ITERATION_NUMBER + 1)
 19                                  END,
 20                    ID[PREV_VAL[0]] = ITERATION_NUMBER + 1
 21                   )
 22            )
 23  SELECT  COUNT(*),
 24          SUM(VAL)
 25    FROM  T
 26  /
Enter value for 1: 100000
old  11:                RULES ITERATE(&1)
new  11:                RULES ITERATE(100000)

  COUNT(*)   SUM(VAL)
---------- ----------
     74253 6575992441

Elapsed: 00:00:02.58
SQL> 


SY.
12 окт 18, 18:18    [21702836]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16909
SY
andrey_anonymous
Красиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.

Без размножения:

SQL> WITH T AS (
...
 22            )
 23  SELECT  COUNT(*),
 24          SUM(VAL)
 25    FROM  T
 26  /
Enter value for 1: 100000
old  11:                RULES ITERATE(&1)
new  11:                RULES ITERATE(100000)

  COUNT(*)   SUM(VAL)
---------- ----------
     74253 6575992441

Elapsed: 00:00:02.58
SQL> 


Ммм?
12 окт 18, 18:26    [21702846]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9230
andrey_anonymous
Ммм?


with t1 as (
select i, Ai
from ( select * from dual
        model ignore nav
        dimension by (0 i)
        measures (0 Ai, 0 t)
        rules iterate (100000)
        ( Ai[iteration_number] = Ai[iteration_number-1]
                               + iteration_number
                               * case when t[Ai[iteration_number-1]-iteration_number] >0
                                        or Ai[iteration_number-1]-iteration_number <= 0
                                    then 1
                                  else -1
                                  end
        , t[Ai[iteration_number]] = 1
        )
) where Ai is not null
)
select count(*),count(distinct Ai) from t1
/

  COUNT(*) COUNT(DISTINCTAI)
---------- -----------------
    100000             74253

SQL> 


Я не учел что:

A(0) = 0
A(n) = A(n-1) - n if A(n-1) - n > 0 and is new, else
A(n) = A(n-1) + n


может породить и порождает дубли.

SY.
12 окт 18, 19:40    [21702898]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16909
SY
Я не учел что:

A(0) = 0
A(n) = A(n-1) - n if A(n-1) - n > 0 and is new, else
A(n) = A(n-1) + n


может породить и порождает дубли.

Угу.
Но сама идея мне понравилась, спасибо.
12 окт 18, 20:11    [21702915]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SkilledJunior
Member

Откуда:
Сообщений: 295
booby
dbms_photoshop
...
это навело на мысли что тема создана не на подходящей площадке и подобное баловство стоит делать на соответствующих сайтах.
а я уж понадеялся, что ты понял неадекватность задачи
для решения её на "голом" sql, совсем без pl/sql.

Интересно было бы посмотреть на эффективное решение с помощью pl/sql и сравнить его по времени выполнения с вариантом SY.
13 окт 18, 02:01    [21703132]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SkilledJunior
Member

Откуда:
Сообщений: 295
booby
Необходимая по условию проверка на существование,
на таком голом sql, которому нельзя заказать временное индексирование
уже набранных значений, гарантированно неэффективна.


Решение подобных задач и на pl/sql не эффективно, если памяти, для языка способного с ней работать напрямую, хватает чтобы закрыть максимальное значение ряда, то индексирование тоже неэффективно с точки зрения производительности.
13 окт 18, 13:48    [21703261]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
-2-
Member

Откуда:
Сообщений: 14107
SkilledJunior
booby
Необходимая по условию проверка на существование,
на таком голом sql, которому нельзя заказать временное индексирование
уже набранных значений, гарантированно неэффективна.
Решение подобных задач и на pl/sql не эффективно...
Не верю.
С остальными запятыми, кто на ком стоял, я разобраться не смог.
13 окт 18, 14:00    [21703266]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9230
SkilledJunior
Интересно было бы посмотреть на эффективное решение с помощью pl/sql и сравнить его по времени выполнения с вариантом SY.


Запросто.

SkilledJunior
Решение подобных задач и на pl/sql не эффективно


Мой вариант с одноатрибутным массивом из N элементов где N число элементов пoследовательности не проходит так-как пoследовательность не уникальна. Поэтому приходится использовать двухатрибутный массив из M элементов где M = N + X так как приходится в нем хранить флаг "а был ли этот мальчик", как Андрей и сделал. В результате приходится оборачивать MODEL в in-line view или CTE и отсеивать лишние X элементов (условие where Ai is not null). В PL/SQL можно создать два одноатрибутных массива и тогда отсеивать не нужно:

SET TIMING ON
DECLARE
    TYPE NUM_LIST_TYPE
      IS
        TABLE OF PLS_INTEGER
          INDEX BY PLS_INTEGER;
    V_SEQ  NUM_LIST_TYPE;
    V_FLAG NUM_LIST_TYPE;
    V_CNT  NUMBER := &1;
    V_SUM  NUMBER;
BEGIN
    V_SEQ(0)  := 0;
    V_FLAG(0) := 0;
    V_SUM     := 0;
--    DBMS_OUTPUT.PUT_LINE('     0      0');
    FOR V_I IN 1..V_CNT - 1 LOOP
      IF V_SEQ(V_I - 1) <= V_I
        THEN
          V_SEQ(V_I) := V_SEQ(V_I - 1) + V_I;
      ELSIF  V_FLAG.EXISTS(V_SEQ(V_I - 1) - V_I)
        THEN 
          V_SEQ(V_I) := V_SEQ(V_I - 1) + V_I;
        ELSE
          V_SEQ(V_I) := V_SEQ(V_I - 1) - V_I;
      END IF;
      V_FLAG(V_SEQ(V_I)) := 0;
--      DBMS_OUTPUT.PUT_LINE(LPAD(V_I,6) || LPAD(V_SEQ(V_I),7));
      V_SUM := V_SUM + V_SEQ(V_I);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('SUM = ' || V_SUM);
END;
/
Enter value for 1: 100000
old   8:     V_CNT  NUMBER := &1;
new   8:     V_CNT  NUMBER := 100000;
SUM = 8643985072

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.09
SQL> 


CREATE OR REPLACE
  TYPE NUM_LIST_TYPE
    IS
      TABLE OF NUMBER
/
CREATE OR REPLACE
  FUNCTION RECAMAN(
                   P_CNT NUMBER
                  )
    RETURN NUM_LIST_TYPE
    IS
        TYPE PLS_INT_LIST_TYPE
          IS
            TABLE OF PLS_INTEGER
              INDEX BY PLS_INTEGER;
        V_SEQ  NUM_LIST_TYPE := NUM_LIST_TYPE();
        V_FLAG PLS_INT_LIST_TYPE;
        V_N    NUMBER;
    BEGIN
        V_SEQ.EXTEND(P_CNT);
        V_SEQ(1)  := 0;
        V_FLAG(1) := 0;
        FOR V_I IN 2..P_CNT LOOP
          V_N := V_I - 1;
          IF V_SEQ(V_I - 1) <= V_N
            THEN
              V_SEQ(V_I) := V_SEQ(V_I - 1) + V_N;
          ELSIF  V_FLAG.EXISTS(V_SEQ(V_I - 1) - V_N)
            THEN 
              V_SEQ(V_I) := V_SEQ(V_I - 1) + V_N;
            ELSE
              V_SEQ(V_I) := V_SEQ(V_I - 1) - V_N;
          END IF;
          V_FLAG(V_SEQ(V_I)) := 0;
        END LOOP;
        RETURN V_SEQ;
END;
/
SELECT  COUNT(*),
        SUM(COLUMN_VALUE)
  FROM  TABLE(RECAMAN(100000))
/

  COUNT(*) SUM(COLUMN_VALUE)
---------- -----------------
    100000        8643985072

Elapsed: 00:00:00.15
SQL> 



Можно еще с pipelined побаловаться.

SY.
13 окт 18, 16:15    [21703318]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SkilledJunior
Member

Откуда:
Сообщений: 295
SY,

К сожалению разреженный ряд получается, простым массивом неэффективно по использованию памяти, но люблю я обычные массивы))

declare
	max_i number := 200000;
	TYPE Recaman IS VARRAY(200000) OF INTEGER;
	TYPE t_check_of_doubles IS VARRAY(1500000) OF varchar2(1);
	a Recaman := Recaman();
	check_of_doubles t_check_of_doubles := t_check_of_doubles();
	n number;
	max_ai number;

	l_systs1 TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
	l_systs2 TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
begin
	a.Extend(max_i);
	check_of_doubles.Extend(1500000);
	
	max_ai :=0;
	
	a(1) := 0;
	check_of_doubles(1) := '1';
	
	for i in 2 .. max_i loop
		n := i-1;
		if a(n)-n > 0 then
			a(i) := a(n)-n;

			if check_of_doubles(a(i)) = '1' then
				a(i) := a(n)+n;
			end if;

		else
			a(i) := a(n)+n;
		end if;

		check_of_doubles(a(i)) := '1';

		if a(i) > max_ai then
		    max_ai:= a(i);
		end if;
		
		if a(i) > 1000000 then
		    dbms_output.put_line('a('||n||') = ' || a(i));
		end if;
		
	end loop;

	dbms_output.put_line('----------------------------');

	for i in (max_i-4) .. max_i loop
		dbms_output.put_line('n = ' || (i-1) || ' a(n) = ' || a(i));
	end loop;
	
	dbms_output.put_line('max = ' || max_ai);
	
	l_systs2 := SYSTIMESTAMP;
	dbms_output.put_line( to_char(round(extract (second from (l_systs2 - l_systs1)),2), '9990.99') || ' секунд' );
end;
14 окт 18, 01:14    [21703494]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SkilledJunior
Member

Откуда:
Сообщений: 295
-2-
Не верю.
С остальными запятыми, кто на ком стоял, я разобраться не смог.

Выделяем область памяти, записываем в нее битовые флаги, число ряда преобразуется в адрес битового флага, по сути оно представляет собой смещение от начала выделенной области памяти. Для проверки существования числа в уже сформированном ряду нужно одно прямое чтение из памяти и извлечение из прочитанного битового флага, никаких массивов и индексаций, PL/SQL такое могёт?
14 окт 18, 01:31    [21703499]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
-2-
Member

Откуда:
Сообщений: 14107
SkilledJunior
и извлечение из прочитанного битового флага
Лишние сдвиги быстродействия не прибавят. Но, если взялся за третий критерий эффективности - объем памяти, давай и компрессию наворачивай.
SkilledJunior
PL/SQL такое могёт?
Работа с битами для plsql не проблема.
14 окт 18, 14:56    [21703632]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5149
hayde
На правах шутки
Здесь проверяется цикличность и при сложении и при вычитании, а должна только при вычитании.
Соответственно 42 во второй раз не выбирается.
SQL> with r(i,a,c)as(select 1,0,ku$_objnumset()from dual
  2  union all select i+1,case when a>i and a-i not member of c then a-i else a+i end,c multiset union ku$_objnumset(a)from r where i<25)select i-1,a from r;

       I-1          A
---------- ----------
         0          0
         1          1
         2          3
         3          6
         4          2
         5          7
         6         13
         7         20
         8         12
         9         21
        10         11
        11         22
        12         10
        13         23
        14          9
        15         24
        16          8
        17         25
        18         43
        19         62
        20         42
        21         63
        22         41
        23         18
        24         42

25 rows selected.

SQL> select level-1,n from(select rownum-1n from xmltable('0to 100'))start with n=0connect by nocycle level-1=abs(n-prior n)and rownum<=25;

   LEVEL-1          N
---------- ----------
         0          0
         1          1
         2          3
         3          6
         4          2
         5          7
         6         13
         7         20
         8         12
         9         21
        10         11
        11         22
        12         10
        13         23
        14          9
        15         24
        16          8
        17         25
        18         43
        19         62
        20         42
        21         63
        22         41
        23         18
        23         64

25 rows selected.
Можно расписать условие соединения и попытаться обмануть Оракл с помощью prior sys_guid, но при таком подходе цикличность вообще не будет проверяться.
SQL> select level-1,n from(select rownum-1n from xmltable('0to 100'))start with n=0connect by nocycle
  2  case when prior n - (level - 1) = n or prior n + (level - 1) = n and prior sys_guid() is not null then 1 end = 1
  3  and not (level > 1 and n = 0)
  4  and rownum<=25;

   LEVEL-1          N
---------- ----------
         0          0
         1          1
         2          3
         3          6
         4          2
         5          7
         6          1
         7          8
         8         16
         9          7
        10         17
        11          6
        12         18
        13          5
        14         19
        15          4
        16         20
        17          3
        18         21
        19          2
        20         22
        21          1
        22         23
        23         46
        24         22

25 rows selected.

SQL> with r(i,a,c)as(select 1,0,ku$_objnumset()from dual
  2  union all select i+1,case when a>i/* and a-i not member of c */then a-i else a+i end,c multiset union ku$_objnumset(a)from r where i<25)select i-1,a from r;

       I-1          A
---------- ----------
         0          0
         1          1
         2          3
         3          6
         4          2
         5          7
         6          1
         7          8
         8         16
         9          7
        10         17
        11          6
        12         18
        13          5
        14         19
        15          4
        16         20
        17          3
        18         21
        19          2
        20         22
        21          1
        22         23
        23         46
        24         22

25 rows selected.
14 окт 18, 17:11    [21703661]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Oracle Ответить