powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Фотошоп, возвращай свою пятничную про последовательности
56 сообщений из 56, показаны все 3 страниц
Фотошоп, возвращай свою пятничную про последовательности
    #39716647
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заинтриговал. Третий час с моделью бьюсь, победить не могу: cyclic/acyclic. Посмотрю потом твои решения.

P.S. Модераторы, ну послал там кто-то фотошопа на Плавучее Нефтяное Хранилище, ну удалили бы пост. Зачем всю тему-то?
Да и вообще, если ругаться запретите, кто ж сюда заходить-то будет?
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716649
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716652
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

Я специально попросил удалить тему целиком.
Если интересны мои решения (model/rec with) напиши в почту.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716657
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

Написал.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716659
merch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopЯ специально попросил удалить тему целиком.

Почему?
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716681
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше бы этого неадеквата забанили (который сразу какашки начал кидать), чем тему удалять
Он, почему-то остался безнаказанным...
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716683
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
merch,

Потому что пятничная создается не для себя с практическим интересом а для людей, для развлечения.
Достаточно одной гниды, которая безнаказанно может писать все что вздумается, чтоб перекрыть плюсы.
Кроме того, учитывая что кроме вышеозначенного никто в теме не отметился,
это навело на мысли что тема создана не на подходящей площадке и подобное баловство стоит делать на соответствующих сайтах.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716690
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop учитывая что кроме вышеозначенного никто в теме не отметился
так еще пятник не кончился :)
считай, что все кому интересно в процессе решения.
я тоже пытаюсь модельку прикрутить, но пока не выходит
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716693
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, не надо катить бочку на модераторов. Они сработали на отлично.
Бан бессмыленный и с его помощью обиды не лечатся, а наоборот.

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

В целях скорейшей развязки, заготовки под спойлером
Код: plsql
1.
2.
3.
4.
5.
select*from dual model dimension by(0 i)measures(0 a)(a[for i from 1to 10increment 1]=
case when a[cv()-1]>cv(i) and a[cv()-1]-cv(i)not member of cast(collect(a)[i<cv()]as ku$_objnumset)then a[cv()-1]-cv(i)else a[cv()-1]+cv(i)end);

with r(i,a,c)as(select 1,0,ku$_objnumset()from dual
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<=10)select i-1,a from r;

...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716699
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а если честно, то он сразу привел решение тоже с ku$_objnumset, просто немного более многобуквенное, но и, возможно, проще для сопровождения
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716701
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, стоп, там просто массив чиселков был -- ну в принципе, тоже ничего
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716707
hayde
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отличная пятничная задачка.
175 символов
Код: sql
1.
with t(i,n,s)as(select 1,0,'.'from dual union all select i+1,n+i*(case when(n<i or s||n||'.'like'%.'||(n-i)||'.%')then 1else-1end),s||n||'.'from t where i<&Z)select i,n from t

...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716711
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop...
это навело на мысли что тема создана не на подходящей площадке и подобное баловство стоит делать на соответствующих сайтах.
о как.
а я уж понадеялся, что ты понял неадекватность задачи
для решения её на "голом" sql, совсем без pl/sql.

Необходимая по условию проверка на существование,
на таком голом sql, которому нельзя заказать временное индексирование
уже набранных значений, гарантированно неэффективна .
В лучшем случае время проверки будет расти линейно.
Разумный человек, даже ради "баловства" не начнет
выписывать её решение на таком "голом sql"

И, просто выполни свои sql для каких-нибудь значений номера последнего вычисляемого
элемента, превышающего, например, 7110...
добавив distinct, ты продвинешься немного, в обмен на оквадрачивание времени.

PS
что за любовь к бессмысленному sql по пятницам...
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716713
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hayde,

я тоже сделал с || и in_str, но ж 4000 символов

.....
stax
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716714
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудровku$_objnumsetku$_vcnt короче.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716719
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopРебята, не надо катить бочку на модераторов. Они сработали на отлично.
Бан бессмыленный и с его помощью обиды не лечатся, а наоборот.

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

В целях скорейшей развязки, заготовки под спойлером
Код: plsql
1.
2.
3.
4.
5.
select*from dual model dimension by(0 i)measures(0 a)(a[for i from 1to 10increment 1]=
case when a[cv()-1]>cv(i) and a[cv()-1]-cv(i)not member of cast(collect(a)[i<cv()]as ku$_objnumset)then a[cv()-1]-cv(i)else a[cv()-1]+cv(i)end);

with r(i,a,c)as(select 1,0,ku$_objnumset()from dual
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<=10)select i-1,a from r;



хотелось БЫ без collect

что-то аля
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select rn,s from dual
  model
  dimension by (0 as rn)
  measures (0 s)
  rules iterate (13)
  (
  s[iteration_number] = ...
  s[iteration_number] order by rn = case when sum(decode(s,s[cv()], 1, 0))[any]=1 
        then ...
        else ...
        end
  )
/



но у меня не выходит каменный цветок

....
stax
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716733
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxчто-то аля
Код: plsql
1.
sum(decode(s,s[cv()], 1, 0))[any]

В выражении для агрегата нельзя ссылаться на "текущую строку".

С другой стороны, мера не может быть коллекцией, так что накапливать посчитанное в мере с целью проверки вхождения тоже не выйдет.
Разве что накапливать в строке с соответствующими ограничениями. Зато итеративная модель и без collect.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716738
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

в строке и через рекурсивный with делается

жаль что нельзя "В выражении для агрегата нельзя ссылаться на "текущую строку"."
по идее не обязательно текущую cv
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716740
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

ой случайно отправил
по идее не обязательно текущую (cv), можно конкретную напр iteration_number, или текущую где-то запоминать

.....
stax
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716741
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я специально попросил удалить тему целиком.Никогда не понимал модераторов, потворствующих ТС-ам в их самомнении, что они полные хозяева созданных ими тем.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716742
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby что за любовь к бессмысленному sql по пятницам...
в пятничных для меня часто не так важна ефективность

более интересно поглядеть на возможности фич напр с model, match_recognize, multiset и тд

....
stax
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716750
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicЯ специально попросил удалить тему целиком.Никогда не понимал модераторов, потворствующих ТС-ам в их самомнении, что они полные хозяева созданных ими тем.Помнится, Маркеленков просил удаление своих ПОСТОВ
Все проще -- надо требовать удаления ТОПИКОВ, где встречались его посты
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716751
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxхотелось БЫ без collect
что-то аля
Код: plsql
1.
2.
3.
4.
5.
select rn,s from dual
  model
  dimension by (0 as rn)
  measures (0 s)
  rules iterate (13)



Проще простого :)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select i, Ai 
from ( select * from dual
        model ignore nav
        dimension by (0 i)
        measures (0 Ai, 0 t, 0 yy)
        rules iterate (11)
        ( 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
order by i
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716755
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какое условие задачи? Получить ряд для N элементов на голом sql ?
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716757
hayde
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxhayde,

я тоже сделал с || и in_str, но ж 4000 символов

.....
stax
Ну так ведь и NUMBER ограничен (:


На правах шутки:
154 символа
Код: sql
1.
select level i,n from(select &Z z,rownum-1n from xmltable('0to &Z*&Z'))where rownum<=z start with n=0connect by nocycle level-1=abs(n-prior n)and level<=z

...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716763
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadЗаинтриговал. Третий час с моделью бьюсь, победить не могу: cyclic/acyclic.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
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.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716775
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

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

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

....
stax
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716782
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxбуду осознавать
Из трюков там только смешанное использование dimension - как индекса последовательности Ai и как кэша встреченных значений последовательности t, собственно поэтому пришлось оборачивать в динамическое представление - отфильтровать Ai is not null...
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716791
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровВсе проще -- надо требоватьНе совсем понятно к чему это ёрничанье.
На Stack Overflow можно удалять свои темы, посты или редактировать их как угодно.
И ничего - живет ресурс. И что удивительно без взаимных тычков.
Диктатура имеет смысл только в определенных сообществах.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716805
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxтекущую где-то запоминатьОчередная вариация
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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)
)
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716810
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopStaxтекущую где-то запоминатьОчередная вариация[/src]
Красиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716813
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

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

PS.
Можно учитывать заполненность первой строки и уменьшить число итераций на одну,
при этом убрав ignore nav в предложенных вариантах с минимальными изменениями.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716821
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopМожно учитывать заполненность первой строки
Еще можно попробовать учесть тот факт, что минимальное возможное значение i-го элемента последовательности растет, что теоретисски допускает сокращение размера кэша значений.
Код: sql
1.
min(Ai) over(order by i rows 10 preceding) m_i
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716824
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopДа, решение с "душком".

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

Попробовал "вариацию" на 100000 итерациях - что-то оно "ушло в себя".
Вариант Соломона (с двойной итерацией) тоже.
Мой вариант уложился в 3 секунды.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
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>  
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716828
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Трюк с nested cells не оставляет никаких шансов прочим проверкам.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716854
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousКрасиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
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> 



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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
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.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716861
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYandrey_anonymousКрасиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.
Без размножения:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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> 



Ммм?
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716887
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousМмм?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716899
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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


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

Угу.
Но сама идея мне понравилась, спасибо.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716994
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
boobydbms_photoshop...
это навело на мысли что тема создана не на подходящей площадке и подобное баловство стоит делать на соответствующих сайтах. а я уж понадеялся, что ты понял неадекватность задачи
для решения её на "голом" sql, совсем без pl/sql.
Интересно было бы посмотреть на эффективное решение с помощью pl/sql и сравнить его по времени выполнения с вариантом SY.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717060
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
boobyНеобходимая по условию проверка на существование,
на таком голом sql, которому нельзя заказать временное индексирование
уже набранных значений, гарантированно неэффективна .

Решение подобных задач и на pl/sql не эффективно, если памяти, для языка способного с ней работать напрямую, хватает чтобы закрыть максимальное значение ряда, то индексирование тоже неэффективно с точки зрения производительности.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717062
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorboobyНеобходимая по условию проверка на существование,
на таком голом sql, которому нельзя заказать временное индексирование
уже набранных значений, гарантированно неэффективна .Решение подобных задач и на pl/sql не эффективно...Не верю.
С остальными запятыми, кто на ком стоял, я разобраться не смог.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717099
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 можно создать два одноатрибутных массива и тогда отсеивать не нужно:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
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> 



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
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.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717173
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
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;
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717176
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-Не верю.
С остальными запятыми, кто на ком стоял, я разобраться не смог.
Выделяем область памяти, записываем в нее битовые флаги, число ряда преобразуется в адрес битового флага, по сути оно представляет собой смещение от начала выделенной области памяти. Для проверки существования числа в уже сформированном ряду нужно одно прямое чтение из памяти и извлечение из прочитанного битового флага, никаких массивов и индексаций, PL/SQL такое могёт?
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717258
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJunior и извлечение из прочитанного битового флагаЛишние сдвиги быстродействия не прибавят. Но, если взялся за третий критерий эффективности - объем памяти, давай и компрессию наворачивай.
SkilledJuniorPL/SQL такое могёт?Работа с битами для plsql не проблема.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717277
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
haydeНа правах шуткиЗдесь проверяется цикличность и при сложении и при вычитании, а должна только при вычитании.
Соответственно 42 во второй раз не выбирается.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
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, но при таком подходе цикличность вообще не будет проверяться.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
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.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Фотошоп, возвращай свою пятничную про последовательности
    #40024849
Miserere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select a from dual
model
dimension by(0 id)
measures(0 a)
ignore nav
rules iterate(30)
(
a[iteration_number] = case when a [iteration_number - 1 ] > iteration_number then 1 else -1 end,
a[iteration_number] = a[iteration_number - 1] - iteration_number * a[iteration_number],
update a[id] = case when count(*) over(partition by a order by id) > 1 then a[cv(id) - 1] + cv(id) else a[cv(id)] end
)
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #40024867
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miserere,

Если и занимаешься некрофильством то хоть приводи улучшенное решение.
Ну а теперь запусти это c rules iterate(100000) и сравни (если дождешься) с моим

Код: plsql
1.
2.
3.
4.
5.
6.
  COUNT(*) SUM(COLUMN_VALUE)
---------- -----------------
    100000        8643985072

Elapsed: 00:00:00.15
SQL> 



SY.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #40024924
Miserere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это challenge, SY, производительность тут у ходит на второй план, никто не ставит это на прод.
Я задался вопросом как уйти отStaxтекущую где-то запоминать
С выходом на дубликат через флажок и его вариациями любой дурак сделает. Хочешь побахвалиться - сделай свои
Код: plsql
1.
Elapsed: 00:00:00.15


с одним measure
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #40024945
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miserere
Хочешь побахвалиться - сделай свои
Код: plsql
1.
Elapsed: 00:00:00.15


с одним measure


А что было такое условие? А если ты "задался вопросом как уйти от" то неплохо бы информировать остальных ибо скорость была критерием решения данной задачи.

SY.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #40025027
Miserere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прежде чем раздавать советы, SY, придерживайся их сам.
Ты исчерпался придумать что-то еще и скатился в производительность, и теперь навязываешь этот критерий окружающим как главный
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #40025052
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miserere
Прежде чем раздавать советы, SY, придерживайся их сам.
Ты исчерпался придумать что-то еще и скатился в производительность, и теперь навязываешь этот критерий окружающим как главный
С выходом на дубликат через флажок и его вариациями любой дурак сделает. Хочешь побахвалиться - сделай свои
с одним measure


Хочешь с одним measure? Пожалуйста:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select  a
  from  dual
  model
    dimension by(0 n,0 a)
    measures(0 dummy)
    rules iterate(9999)
      (
       dummy[0,0] = max(dummy)[iteration_number,any] - iteration_number - 1,
       dummy[0,0] = case
                      when     dummy[0,0] > 0
                           and
                               max(dummy)[any,dummy[0,0]] is null
                        then dummy[0,0]
                    else dummy[0,0] + 2 * (iteration_number + 1)
                  end,
      dummy[
            iteration_number + 1,
            dummy[0,0]
           ] = dummy[0,0]
     )
/



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


Твое решение:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> with t as (
  2  select a from dual
  3  model
  4  dimension by(0 id)
  5  measures(0 a)
  6  ignore nav
  7  rules iterate(10000)
  8  (
  9  a[iteration_number] = case when a [iteration_number - 1 ] > iteration_number then 1 else -1 end,
 10  a[iteration_number] = a[iteration_number - 1] - iteration_number * a[iteration_number],
 11  update a[id] = case when count(*) over(partition by a order by id) > 1 then a[cv(id) - 1] + cv(id) else a[cv(id)] end
 12  )
 13  )
 14  select count(*),sum(a) from t
 15  /

  COUNT(*)     SUM(A)
---------- ----------
     10000   82590002

Elapsed: 00:04:34.68
SQL>



Mое решение:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SQL> with t as (
  2  select  a
  3    from  dual
  4    model
  5      dimension by(0 n,0 a)
  6      measures(0 dummy)
  7      rules iterate(9999)
  8        (
  9         dummy[0,0] = max(dummy)[iteration_number,any] - iteration_number - 1,
 10         dummy[0,0] = case
 11                        when     dummy[0,0] > 0
 12                             and
 13                                 max(dummy)[any,dummy[0,0]] is null
 14                          then dummy[0,0]
 15                      else dummy[0,0] + 2 * (iteration_number + 1)
 16                    end,
 17        dummy[
 18              iteration_number + 1,
 19              dummy[0,0]
 20             ] = dummy[0,0]
 21       )
 22  )
 23  select count(*),sum(a) from t
 24  /

  COUNT(*)     SUM(A)
---------- ----------
     10000   82590002

Elapsed: 00:00:46.52
SQL>



Дерзай.

SY.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #40027612
Miserere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, ты умеешь найти лазейку в законодательстве
Приниципиального отличия от твоей предыдущей версии я не вижу, перенес measure в dimension , справился... Все равно ты используешь отдельную колонку чтобы Staxтекущую где-то запоминать
Еще и дольше выполняется. Does it make a difference?
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #40029584
Miserere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Давай пострирейсим, SY
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
SQL>  with t as
 (select level - 2 as id, 0 as a from dual connect by level <= 1e5)
select count(*), sum(a) from (
   select * from t
     model
     dimension by(id)
     measures(a)
     rules iterate(1e5)
     (
      a[iteration_number] = a[iteration_number - 1] - iteration_number 
       + case when 1 > any(a[iteration_number - 1] - iteration_number, a[-(a[iteration_number - 1] - iteration_number)]) then 2 * iteration_number else 0 end,
      a[-a[iteration_number]] = 0
     ) 
) where id > -1;

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

Elapsed: 00:00:01.64
SQL> /

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

Elapsed: 00:00:01.25
SQL> /

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

Elapsed: 00:00:01.58
SQL> /

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

Elapsed: 00:00:01.65
SQL> /

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

Elapsed: 00:00:01.31

...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #40029594
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неплохо, правда 99% улучшения производительности за счет пре-генерации таблицы. Но можно чуточку улучшить:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
with t as (
           select level - 1 n,0 a from dual connect by level <= 1e5
          ),
     x as (
           select  n,
                   a
             from  t
             model
               dimension by(n)
               measures(0 a)
               rules iterate(99999)
                 (
                  a[iteration_number + 1] = case
                                              when a[least(0,iteration_number + 1 - a[iteration_number])] is null
                                                then a[iteration_number] - (iteration_number + 1)
                                                else a[iteration_number] + (iteration_number + 1)
                                            end,
                 a[-a[iteration_number + 1]] = 0
                )
           )
select  count(*),
        sum(a)
  from  x
  where n >= 0
/

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

Elapsed: 00:00:00.42
SQL> /

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

Elapsed: 00:00:00.39
SQL> /

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

Elapsed: 00:00:00.39
SQL> /

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

Elapsed: 00:00:00.40
SQL>



А теперь твое:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
with t as
 (select level - 2 as id, 0 as a from dual connect by level <= 1e5)
select count(*), sum(a) from (
   select * from t
     model
     dimension by(id)
     measures(a)
     rules iterate(1e5)
     (
      a[iteration_number] = a[iteration_number - 1] - iteration_number
       + case when 1 > any(a[iteration_number - 1] - iteration_number, a[-(a[iteration_number - 1] - iteration_number)]) then 2 * iteration_number else 0 end,
      a[-a[iteration_number]] = 0
     )
) where id > -1
/

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

Elapsed: 00:00:00.46
SQL> /

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

Elapsed: 00:00:00.44
SQL> /

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

Elapsed: 00:00:00.43
SQL> /

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

Elapsed: 00:00:00.42
SQL> 



SY.
...
Рейтинг: 0 / 0
56 сообщений из 56, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Фотошоп, возвращай свою пятничную про последовательности
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]