powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ссылка на предыдущую строку в иерархическом запросе
24 сообщений из 24, страница 1 из 1
Ссылка на предыдущую строку в иерархическом запросе
    #39327501
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Есть запрос:
Код: plsql
1.
2.
3.
4.
select (gid+gid-zak)/sum(gid+gid-zak) over (partition by nskvz, rank_dat) as fi,
  from temp3 t
connect by prior t.id = t.parent
start with rank_dat = 1;



Как умножить zak на fi?
Не могу врубиться.
В PostgreSQL я сделал в следующем виде:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
	WITH RECURSIVE cte AS (
	   SELECT *, 
	          gid as sum_nak,
	          case when gid = 0 then 0 else gid/sum(gid) over (partition by nskvz) end  as fi
	     FROM temp_factor2_cal 
		WHERE rank_dat = 1 
	   UNION  ALL
	   SELECT t.nskvz, 
	          t.nskvd,
	          t.dat, 
	          t.gid,
	          t.zak, 
	          t.id,
	          t.rank_dat,
	          t.parent,
	          c.sum_nak + t.gid - c.zak*c.fi as sum_nak,
	          case when c.sum_nak = 0 then 0 else (c.sum_nak + t.gid - c.zak*c.fi)/sum(c.sum_nak + t.gid - c.zak*c.fi) over (partition by t.nskvz, t.rank_dat) end  as fi
	     FROM cte c,
	          temp_factor2_cal t 
	    WHERE t.parent = c.id
	          )
	SELECT distinct cte.nskvz, cte.nskvd, cte.fi as fi3
	FROM   cte



Ваще не могу понять как это победить. Ссылка саму на себя меня убивает.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327504
vadipokКак умножить zak на fi?zak*fi

vadipokВ PostgreSQL я сделали зачем переделывать через connect by?

vadipokСсылка на предыдущую строку в иерархическом запросе prior
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327508
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шмарт квестионzak*fi
fi берется из предыдущей строки, в этом вся проблема.
По сути расчет строки зависит от самой себя, по возрастанию.

шмарт квестиони зачем переделывать через connect by?
А куда деваться? Это иерархический запрос в формате PostgreSQL
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327512
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokА куда деваться? Это иерархический запрос в формате PostgreSQL
Точно?
https://docs.oracle.com/cloud/latest/db112/SQLRF/statements_10002.htm#BABCDJDB
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327518
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousvadipokА куда деваться? Это иерархический запрос в формате PostgreSQL
Точно?
https://docs.oracle.com/cloud/latest/db112/SQLRF/statements_10002.htm#BABCDJDB

Ну конечно точно, повторюсь это иерархический запрос в PostgreSQL.
Возможно это что-то в Oracle, про это я ничего не сказал.
А за ссылку спасибо, изучу.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327524
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokНу конечно точно, повторюсь это иерархический запрос в PostgreSQL.
Возможно это что-то в Oracle, про это я ничего не сказал.

Мсье сказал, что вынужден переделывать на connect by, потому как "формат не той системы":

vadipokшмарт квестиони зачем переделывать через connect by?
А куда деваться? Это иерархический запрос в формате PostgreSQL

Так вот: мсье заблуждается.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327528
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, давайте не будем спорить.
Возможно я сглупил, несколько сумбурно высказавшись.
Давайте упростим задачу.
Как выполнить следующий запрос:
Код: plsql
1.
2.
3.
4.
5.
select case when level = 1 then gid
            when level != 1 then gid - zak*FI (выдергивается из предыдущего уровня иерархии)
       end as FI
  from temp3 t
connect by t.id = t.parent;


Поля FI нет в таблице, он рассчитывается.
Для первого шага расчет ясен.
Вот как выполнить второй и дальнейшие шаги?
Необходимо найти FI из прядущего LEVEL.
Помогите пожалуйста!
И забудем про то, что я написал раньше.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327533
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Использовать PRIOR
2. Взять исходный запрос "в формате", доработать до требований oracle (ссылку я давал) и пользоваться.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327544
andrey_anonymous1. Использовать PRIORОн не умеет формулировать вопросы, ему нужна не просто предыдущая строка.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327563
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous1. Использовать PRIOR
2. Взять исходный запрос "в формате", доработать до требований oracle (ссылку я давал) и пользоваться.

Все отлично, спасибо.

только одна беда, не могу умножить на FI
Код: 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.
	--create table portal.temp_factor3_cal as
	WITH cte (nskvz, nskvd, dat, gid, zak, id, rank_dat, sum_nak, fi) AS (
	   SELECT nskvz, 
	          nskvd,
	          dat, 
	          gid,
	          zak, 
	          id,
	          rank_dat,
	          --parent, 
	          gid as sum_nak,
            --TO_NUMBER(case when gid = 0 then 0 else gid/sum(gid) over (partition by nskvz) end, '999999D99', 'NLS_NUMERIC_CHARACTERS = ''. ''')
            case when gid = 0 then 0 else gid/sum(gid) over (partition by nskvz) end
	     FROM temp3 
		WHERE rank_dat = 1 
	   UNION  ALL
	   SELECT t.nskvz, 
	          t.nskvd,
	          t.dat, 
	          t.gid,
	          t.zak, 
	          t.id,
	          t.rank_dat,
	          c.sum_nak + t.gid - c.zak as sum_nak,--,
            /*
            case when c.sum_nak = 0 then 0 
                 else (c.sum_nak + t.gid - c.zak*c.fi)/(sum(c.sum_nak + t.gid - c.zak*c.fi) over (partition by t.nskvz, t.rank_dat))
            end
            */
            --TO_NUMBER(sum(c.sum_nak + t.gid - c.zak) over (partition by t.nskvz, t.rank_dat), '999999D99', 'NLS_NUMERIC_CHARACTERS = ''. ''')
            sum(c.sum_nak + t.gid - c.zak * c.fi) over (partition by t.nskvz, t.rank_dat)
	     FROM cte c,
	          temp3 t 
	    WHERE t.parent = c.id
	          )
	SELECT distinct c.nskvz, c.nskvd, c.fi
	FROM   cte c;



При попытке умножения возникает ошибка:
Код: plsql
1.
ORA-01426: numeric overflow
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327577
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не ужели никто не знает как победить?
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327585
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
	--create table portal.temp_factor3_cal as
	WITH cte (nskvz, nskvd, dat, gid, zak, id, rank_dat, sum_nak, fi) AS (
	   SELECT nskvz, 
	          nskvd,
	          dat, 
	          gid,
	          zak, 
	          id,
	          rank_dat,
	          gid as sum_nak,
                  sum(TO_NUMBER(gid, '999999D99')) over (partition by nskvz)
	     FROM temp3 
		WHERE rank_dat = 1 
	   UNION  ALL
	   SELECT t.nskvz, 
	          t.nskvd,
	          t.dat, 
	          t.gid,
	          t.zak, 
	          t.id,
	          t.rank_dat,
	          c.sum_nak + t.gid - c.zak as sum_nak,
                  TO_NUMBER(c.zak + c.fi, '999999D99')
	     FROM cte c,
	          temp3 t 
	    WHERE t.parent = c.id
	          )
	SELECT distinct c.nskvz, c.nskvd, c.fi
	FROM   cte c;


А вот так уже нет:
Код: plsql
1.
TO_NUMBER(c.zak * c.fi, '999999D99')


Это уже явный косяк СУБД.
Достал уже, помогите парни.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327608
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok
Код: plsql
1.
TO_NUMBER(c.zak * c.fi, '999999D99')


Это уже явный косяк СУБД.
Достал уже, помогите парни.
Применить to_number к number - это явный косяк, причем не в СУБД.

Если не в состоянии справиться с банальной арифметикой - придется идти по длинному пути.
create table + тестовые данные + ожидаемый результат.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327626
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousvadipok
Код: plsql
1.
TO_NUMBER(c.zak * c.fi, '999999D99')


Это уже явный косяк СУБД.
Достал уже, помогите парни.
Применить to_number к number - это явный косяк, причем не в СУБД.

Если не в состоянии справиться с банальной арифметикой - придется идти по длинному пути.
create table + тестовые данные + ожидаемый результат.

Так в том то и дело, что он заработал только так.
Естественно я в начале делал напрямую, не получилось.
Ругается на тип данных.
Покажите плиз, как бы вы сделали.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327627
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokПокажите плиз, как бы вы сделали.
Вы ждете конкретного ответа на сферический вакуумный вопрос.
Так не бывает.
Еще раз, медленно: описание таблицы, исходные данные, ожидаемый результат - тогда будет предметный разговор.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327628
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousvadipokПокажите плиз, как бы вы сделали.
Вы ждете конкретного ответа на сферический вакуумный вопрос.
Так не бывает.
Еще раз, медленно: описание таблицы, исходные данные, ожидаемый результат - тогда будет предметный разговор.

Понял, вот рабочий запрос:
Код: 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.
	--create table portal.temp_factor3_cal as
	WITH cte (nskvz, nskvd, dat, gid, zak, id, rank_dat, sum_nak, fi) AS (
	   SELECT nskvz, 
	          nskvd,
	          dat, 
	          gid,
	          zak, 
	          id,
	          rank_dat,
	          gid as sum_nak,
                  sum(TO_NUMBER(gid, '999999D99')) over (partition by nskvz)
	     FROM temp3 
		WHERE rank_dat = 1 
	   UNION  ALL
	   SELECT t.nskvz, 
	          t.nskvd,
	          t.dat, 
	          t.gid,
	          t.zak, 
	          t.id,
	          t.rank_dat,
	          c.sum_nak + t.gid - c.zak as sum_nak,
                  TO_NUMBER(c.zak + c.fi, '999999D99')
	     FROM cte c,
	          temp3 t 
	    WHERE t.parent = c.id
	          )
	SELECT distinct c.nskvz, c.nskvd, c.fi
	FROM   cte c;



Мне нужно, для начала, чтобы в строке
Код: plsql
1.
TO_NUMBER(c.zak + c.fi, '999999D99')


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

Поля zak и gid в таблице имеют тип данных number(20,5) или просто number уже не помню, я дома теперь.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327634
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokМне нужно, для начала, чтобы в строке
Код: plsql
1.
TO_NUMBER(c.zak + c.fi, '999999D99')


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

Это делается так:
Код: plsql
1.
c.zak * c.fi



Теперь про победы:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t (a,b) as (select 1 a, 2 b from dual
union all select t.a*t.b, t.b+1 from t where t.b < 85
)
select * from t where b = 7
;
 
ORA-01426: numeric overflow
 
SQL> 


АААА!!!! Как мне победить?!

Применить to_number?
Нет.
Включить голову:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t (a,b) as (select 1 a, 2 b from dual
union all select t.a*t.b, t.b+1 from t where t.b < 84
)
select * from t where b = 7
;
 
         A          B
---------- ----------
       720          7
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327635
ундерфлов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vadipokзаработал только такесли тебе не важен результат, можно использовать 0 или dbms_random для разнообразия.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327682
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokПонял, вот рабочий запрос:
Код: plsql
1.
2.
                  sum(TO_NUMBER(gid, '999999D99')) over (partition by nskvz)
                  TO_NUMBER(c.zak + c.fi, '999999D99')

Вадя, покай где-нибудь в другом месте, а то может сложиться впечатление, что тут не только ты такой де-бил.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327714
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousvadipokМне нужно, для начала, чтобы в строке
Код: plsql
1.
TO_NUMBER(c.zak + c.fi, '999999D99')


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

Это делается так:
Код: plsql
1.
c.zak * c.fi



Теперь про победы:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t (a,b) as (select 1 a, 2 b from dual
union all select t.a*t.b, t.b+1 from t where t.b < 85
)
select * from t where b = 7
;
 
ORA-01426: numeric overflow
 
SQL> 


АААА!!!! Как мне победить?!

Применить to_number?
Нет.
Включить голову:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t (a,b) as (select 1 a, 2 b from dual
union all select t.a*t.b, t.b+1 from t where t.b < 84
)
select * from t where b = 7
;
 
         A          B
---------- ----------
       720          7



Не могли бы объяснить?
И как его применить в моем запросе?
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327715
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да, почему с этим справляется PostgreSQL?
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327724
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokИ да, почему с этим справляется PostgreSQL?

Беру свои слова обратно, в PostgreSQL дела еще хуже, при 13 работает, а при 14:
Код: plsql
1.
2.
3.
4.
5.
6.
with RECURSIVE t (a,b) as (
select 1 a, 2 b
union all select t.a*t.b, t.b+1 from t where t.b < 14
)
select * from t where b = 7
;



Код: sql
1.
2.
3.
4.
5.
ОШИБКА:  целое вне диапазона
********** Ошибка **********

ОШИБКА: целое вне диапазона
SQL-состояние: 22003
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327792
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokНе могли бы объяснить?


Ты прикидываешься? Ты про бесконечные ряды в школе хоть слышал? Твоя начальная рекурсия создает бесконечный ряд покуда в ней нет никаких условий ограничения ряда. А то что привел andrey_anonymous показывает что 83ий член рядa (рекурсии) еще вписывается в дозволенную разрядность а 84ый уже нет. Т.e. 82! влeзает a 83! уже нет.

SY.
...
Рейтинг: 0 / 0
Ссылка на предыдущую строку в иерархическом запросе
    #39327937
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYvadipokНе могли бы объяснить?


Ты прикидываешься? Ты про бесконечные ряды в школе хоть слышал? Твоя начальная рекурсия создает бесконечный ряд покуда в ней нет никаких условий ограничения ряда. А то что привел andrey_anonymous показывает что 83ий член рядa (рекурсии) еще вписывается в дозволенную разрядность а 84ый уже нет. Т.e. 82! влeзает a 83! уже нет.

SY.

Меня просто с калии выбило то, что боевой запрос выполнялся в PostgreSQL без этих премудростей.
В изначальном боевом запросе я абсолютно ничего не менял, он работал там без проблем.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ссылка на предыдущую строку в иерархическом запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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