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

Откуда:
Сообщений: 126
dbms_photoshop
Классно. Ты ж и показать сможешь, да?

Видишь суслика? Нет? А он есть))
28 сен 18, 21:11    [21689544]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
nullin
Member

Откуда: pullin
Сообщений: 32
SkilledJunior
dbms_photoshop
Классно. Ты ж и показать сможешь, да?

Видишь суслика? Нет? А он есть))

Судя по всему там джойн на таблицу чисел по копеечкам, применительно к данным ТС, но правда, если точность cap далеко за сотые, то...
29 сен 18, 01:40    [21689689]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2338
Блог
dbms_photoshop,

Да, сегодня голова не болит и я согласен - только рекурсия.
29 сен 18, 07:30    [21689728]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
SkilledJunior
Member

Откуда:
Сообщений: 126
SkilledJunior
Видишь суслика? Нет? А он есть))


Пятница прошла давно и пятничный суслик убежал, гениев SQL не обнаружено ((

Павел Воронцов
dbms_photoshop,

Да, сегодня голова не болит и я согласен - только рекурсия.


Задача не имеет не итеративных решений, рекурсия кривой метод реализации итераций, нормальный метод озвучил:
andrey_anonymous
оформите pipelined функцией и не морочьте голову.
30 сен 18, 00:09    [21690164]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
SkilledJunior
Member

Откуда:
Сообщений: 126
На вентилятор ...

create or replace package m_test as
  g_val_alt number;
  g_res_alt number;

 function get_res(p_val in number, p_rn in number) return number;
end m_test;
/

create or replace package body m_test as
  g_val number;
  g_res number;

 function get_res(p_val in number, p_rn in number) return number is
 PRAGMA UDF;
 begin
   if p_rn > 1 then
     if p_val > g_val + 0.5 then
       g_val := p_val;
       g_res := g_res + 1;
     end if;
   else 
     g_val := p_val;
     g_res := 1;
   end if;
   return g_res;
 end;
 
end m_test;
/


with
 function get_res_alt(p_val in number, p_rn in number) return number is
 begin
   if p_rn > 1 then
     if p_val > m_test.g_val_alt + 0.5 then
       m_test.g_val_alt := p_val;
       m_test.g_res_alt := m_test.g_res_alt + 1;
     end if;
   else 
     m_test.g_val_alt := p_val;
     m_test.g_res_alt := 1;
   end if;
   return m_test.g_res_alt;
 end;
  m_data as
  (
    select 86 as id, 0 as val from dual union all
    select 10 as id, 3.5 as val from dual union all
    select 104 as id, 3.75 as val from dual union all
    select 99 as id, 4.9 as val from dual union all
    select 97 as id, 5 as val from dual union all
    select 19 as id, 5.67 as val from dual union all
    select 8 as id, 5.83 as val from dual union all
    select 7 as id, 5.83 as val from dual union all
    select 15 as id, 6.25 as val from dual union all
    select 17 as id, 6.25 as val from dual union all
    select 170 as id, 6.31 as val from dual union all
    select 171 as id, 6.51 as val from dual union all
    select 2 as id, 6.89 as val from dual
  )
  select rownum,
         id,
         val,
         m_test.get_res(val, rownum),
         get_res_alt(val, rownum)
  from (select id, val from m_data order by val)
30 сен 18, 01:11    [21690187]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16773
Energomarket
средствами oracle 10g


SkilledJunior
На вентилятор ...

 PRAGMA UDF;


with
 function get_res_alt(p_val in number, p_rn in number) return number is
 begin
1 окт 18, 15:41    [21691403]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
SkilledJunior
Member

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

Без PRAGMA UDF пакетный вариант будет работать и в десятке, больше ничего в таком решении не смущает?
1 окт 18, 22:56    [21691959]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28282
SkilledJunior
больше ничего в таком решении не смущает?
SQL сам накажет самовлюблённых гениёв за использование функций с побочными эффектами.
2 окт 18, 07:41    [21692134]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
SkilledJunior
Member

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

Да, для пользовательских функций Oracle не гарантирует ни нужную последовательность ни количество вызовов для каждой строки, хотя сам вполне себе генерирует псевдостолбец rownu, т.е. механизм имеется.
3 окт 18, 23:22    [21694682]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28282
SkilledJunior
хотя сам вполне себе генерирует псевдостолбец rownu, т.е. механизм имеется.
Бред.
4 окт 18, 07:53    [21694764]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
-2-
Member

Откуда:
Сообщений: 13838
SkilledJunior
для пользовательских функций
если уж браться за plsql, то за обычный или полиморфный pipeline.
4 окт 18, 08:46    [21694791]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
-2-
Member

Откуда:
Сообщений: 13838
+ PTF
create or replace package reset_running_distance_ptf is
function describe(
  tab  in out dbms_tf.table_t,
  col  in     dbms_tf.columns_t,
  dist number default 1.0
) return dbms_tf.describe_t;
procedure fetch_rows(dist number default 1.0);
end reset_running_distance_ptf;
/

create or replace package body reset_running_distance_ptf is 
function describe(
  tab  in out dbms_tf.table_t,
  col  in     dbms_tf.columns_t,
  dist number default 1.0
) return dbms_tf.describe_t is
  ok boolean;
begin
  if col.count <> 1 then
    raise_application_error(-20001, 'Должна быть указана одна колонка скольжения');
  end if;
  ok := false;
  for i in 1..tab.column.count loop
    if tab.column(i).description.name = col(1) and tab.column(i).description.type = dbms_tf.type_number then
      ok := true;
      tab.column(i).for_read := true;
      exit;
    end if;
  end loop;
  if not ok then
    raise_application_error(-20002, 'Колонка скольжения должна иметь тип НУМБЕР');
  end if;
  --
  return dbms_tf.describe_t(
    new_columns => dbms_tf.columns_new_t(1=>dbms_tf.column_metadata_t(name=>'DISTANCE_GROUP', type=>dbms_tf.type_number)));
end describe; 
procedure fetch_rows(dist number default 1.0) is
  dg_num  number;
  dg_end  number;
  ru_col  dbms_tf.tab_number_t;
  dg_col  dbms_tf.tab_number_t;
begin
  dbms_tf.get_col(1, ru_col);
  dg_num := 0;             dbms_tf.xstore_get('dg_num', dg_num);
  dg_end := ru_col(1) - 1; dbms_tf.xstore_get('dg_end', dg_end);
  for i in 1..ru_col.count loop
      if ru_col(i) > dg_end then
        dg_num := dg_num + 1;       dbms_tf.xstore_set('dg_num', dg_num);
        dg_end := ru_col(i) + dist; dbms_tf.xstore_set('dg_end', dg_end);
      end if;        
      dg_col(i) := dg_num;
  end loop;
  dbms_tf.put_col(1, dg_col);
end fetch_rows;
end reset_running_distance_ptf; 
/

create or replace function reset_running_distance(
  tab table,
  col columns,
  dist number default 1.0
) return table pipelined table polymorphic using reset_running_distance_ptf; 
/
with m_data as (...)
select * from reset_running_distance(m_data order by val, columns(val), 0.5);

ID	VAL	DISTANCE_GROUP
86	0	1
10	3.5	2
104	3.75	2
99	4.9	3
97	5	3
19	5.67	4
8	5.83	4
7	5.83	4
15	6.25	5
17	6.25	5
4 окт 18, 10:55    [21694895]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16773
-2-
with m_data as (...)
select * from reset_running_distance(m_data order by val, columns(val), 0.5);

Записал, спасибо.
4 окт 18, 18:32    [21695646]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
SkilledJunior
Member

Откуда:
Сообщений: 126
Elic
Бред.
Сформировать rownum можно либо имея доступ к тому же столбцу предыдущей строки, либо сохраняя последний присвоенный номер в переменную, при этом необходимо гарантировать последовательность прохода по выборке и отсутствие увеличения счетчика более одного раза для одной и той же строки. Оба механизма реализуют итеративный инкремент по выборке и подошли бы для решения задачи.

-2-
если уж браться за plsql, то за обычный или полиморфный pipeline.

Да я и не спорю:
SkilledJunior
Задача не имеет не итеративных решений, рекурсия кривой метод реализации итераций, нормальный метод озвучил:
andrey_anonymous
оформите pipelined функцией и не морочьте голову.


Полиморфный метод зачетный, кинул в избранное.
5 окт 18, 14:06    [21696381]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
dbms_photoshop
Member

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

Ты точно понял первые два-три слова отсюда, формирователь?
dbms_photoshop
никакими SQL-методами, кроме перечисленных -2- задача нерешаема


Хорошо хоть сам написал, что Оракл не гарантирует последовательность вызова функций.
Даже лень проверять будет ли устойчив эффект при параллельном выполнении. Слишком тухлый вброс.
5 окт 18, 14:30    [21696417]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
SkilledJunior
Member

Откуда:
Сообщений: 126
dbms_photoshop
Даже лень проверять будет ли устойчив эффект при параллельном выполнении.

Банальный пример, конечное не будет устойчив, другие примеры нарушения последовательности были бы более интересны, а примеры многократного вызова функции для одной и той же строки еще интереснее.

Еще интересный вопрос, что сделает rownum без сортировки и rownum from (select ... order by) с параллельным выполнением запроса.
5 окт 18, 15:25    [21696492]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
-2-
Member

Откуда:
Сообщений: 13838
SkilledJunior
другие примеры нарушения последовательности
  select rownum,
         id,
         row_number() over(order by id) r_id,
         val,
         m_test.get_res(val, rownum) g1,
         get_res_alt(val, rownum) g2
  from (select id, val from m_data order by val)
  order by val
;

    ROWNUM         ID       R_ID        VAL         G1         G2
---------- ---------- ---------- ---------- ---------- ----------
         1         86          8          0          1          1
         2         10          4        3.5          4          4
         3        104         11       3.75          2          2
         4         99         10        4.9          2          2
         5         97          9          5          2          2
         6         19          7       5.67          4          4
         7          8          3       5.83          4          4
         8          7          2       5.83          4          4
         9         15          5       6.25          4          4
        10         17          6       6.25          4          4
        11        170         12       6.31          3          3
        12        171         13       6.51          3          3
        13          2          1       6.89          4          4
5 окт 18, 16:02    [21696553]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
SkilledJunior
примеры многократного вызова функции для одной и той же строки еще интереснее.
Вспоминаются примеры недовызова. 16679179 (хотя rownum это как раз "лечит")
SkilledJunior
Еще интересный вопрос, что сделает rownum без сортировки и rownum from (select ... order by) с параллельным выполнением запроса.
При параллельности ты не управляешь тем какие порции данных идут в какой slave не говоря уже про то, что любые попытки использовать stateful пакеты бессмысленны.
5 окт 18, 16:04    [21696556]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16773
dbms_photoshop
При параллельности ты не управляешь тем какие порции данных идут в какой slave не говоря уже про то, что любые попытки использовать stateful пакеты бессмысленны.

Эээ... Вообще-то это, скажем так, не совсем правда по обоим пунктам.
По крайней мере, я и управлял распределением по слейвам, и успешно использовал statefull...
Но не в контексте решения юниора, ессно :)
5 окт 18, 16:35    [21696593]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
SkilledJunior
Member

Откуда:
Сообщений: 126
-2-,

Хороший пример, однако rownum Oracle формирует правильно))

dbms_photoshop
Вспоминаются примеры недовызова. 16679179 (хотя rownum это как раз "лечит")

Ох уж этот экономный Oracle, но все же в примере одна и та же функция с одними и теми же параметрами в разных столбцах, но не в одном столбце разных строк.

SkilledJunior
При параллельности ты не управляешь тем какие порции данных идут в какой slave не говоря уже про то, что любые попытки использовать stateful пакеты бессмысленны.

Вопрос был несколько иной, даст ли rownum и rownum на отсортированной выборке использовать параллельность.
5 окт 18, 16:41    [21696599]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9116
dbms_photoshop
При параллельности ты не управляешь тем какие порции данных идут в какой slave


Что говорит лишь о том что только master мoжет вычислять аналитику. Вернее только master мoжет производить сортировки указанные в аналитике. А можeт ли он потом опять наплодить slaves? Мне пока не удалось создать такой план но это ничего не значит. Это может появится в новых версиях а может я просто плохой повар. Но в любом случае я с тобой полностью согласен только ORDER BY гарантирует порядок строк.

SY.
5 окт 18, 16:45    [21696606]     Ответить | Цитировать Сообщить модератору
 Re: Задача определения "плавающих" групп  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
andrey_anonymous
dbms_photoshop
При параллельности ты не управляешь тем какие порции данных идут в какой slave не говоря уже про то, что любые попытки использовать stateful пакеты бессмысленны.

Эээ... Вообще-то это, скажем так, не совсем правда по обоим пунктам.
По крайней мере, я и управлял распределением по слейвам, и успешно использовал statefull...
Но не в контексте решения юниора, ессно :)
Речь шла про решение Жуниора single row function, а не про любителей явно указывать как распределять данные в пайплайне или еще чего.
5 окт 18, 17:05    [21696635]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Oracle Ответить