Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ссылка на предыдущую строку в иерархическом запросе / 24 сообщений из 24, страница 1 из 1
15.10.2016, 11:49
    #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
15.10.2016, 12:15
    #39327504
Ссылка на предыдущую строку в иерархическом запросе
vadipokКак умножить zak на fi?zak*fi

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

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

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

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

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

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

Так вот: мсье заблуждается.
...
Рейтинг: 0 / 0
15.10.2016, 13:10
    #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
15.10.2016, 13:13
    #39327533
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ссылка на предыдущую строку в иерархическом запросе
1. Использовать PRIOR
2. Взять исходный запрос "в формате", доработать до требований oracle (ссылку я давал) и пользоваться.
...
Рейтинг: 0 / 0
15.10.2016, 13:49
    #39327544
Ссылка на предыдущую строку в иерархическом запросе
andrey_anonymous1. Использовать PRIORОн не умеет формулировать вопросы, ему нужна не просто предыдущая строка.
...
Рейтинг: 0 / 0
15.10.2016, 15:19
    #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
15.10.2016, 16:49
    #39327577
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ссылка на предыдущую строку в иерархическом запросе
Не ужели никто не знает как победить?
...
Рейтинг: 0 / 0
15.10.2016, 17:12
    #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
15.10.2016, 18:57
    #39327608
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ссылка на предыдущую строку в иерархическом запросе
vadipok
Код: plsql
1.
TO_NUMBER(c.zak * c.fi, '999999D99')


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

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


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

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

Так в том то и дело, что он заработал только так.
Естественно я в начале делал напрямую, не получилось.
Ругается на тип данных.
Покажите плиз, как бы вы сделали.
...
Рейтинг: 0 / 0
15.10.2016, 20:16
    #39327627
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ссылка на предыдущую строку в иерархическом запросе
vadipokПокажите плиз, как бы вы сделали.
Вы ждете конкретного ответа на сферический вакуумный вопрос.
Так не бывает.
Еще раз, медленно: описание таблицы, исходные данные, ожидаемый результат - тогда будет предметный разговор.
...
Рейтинг: 0 / 0
15.10.2016, 20:25
    #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
15.10.2016, 20:52
    #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
15.10.2016, 20:53
    #39327635
ундерфлов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ссылка на предыдущую строку в иерархическом запросе
vadipokзаработал только такесли тебе не важен результат, можно использовать 0 или dbms_random для разнообразия.
...
Рейтинг: 0 / 0
16.10.2016, 08:06
    #39327682
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ссылка на предыдущую строку в иерархическом запросе
vadipokПонял, вот рабочий запрос:
Код: plsql
1.
2.
                  sum(TO_NUMBER(gid, '999999D99')) over (partition by nskvz)
                  TO_NUMBER(c.zak + c.fi, '999999D99')

Вадя, покай где-нибудь в другом месте, а то может сложиться впечатление, что тут не только ты такой де-бил.
...
Рейтинг: 0 / 0
16.10.2016, 11:03
    #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
16.10.2016, 11:04
    #39327715
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ссылка на предыдущую строку в иерархическом запросе
И да, почему с этим справляется PostgreSQL?
...
Рейтинг: 0 / 0
16.10.2016, 11:37
    #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
16.10.2016, 15:15
    #39327792
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ссылка на предыдущую строку в иерархическом запросе
vadipokНе могли бы объяснить?


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

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


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

SY.

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


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