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

Есть view ...

CREATE OR REPLACE VIEW REPORT_RATES
(cur_cur_id, start_date, end_date, rate, int_rate, stock_rate)
AS
(SELECT cur_cur_id, date_rate,
LEAD (date_rate, 1, TO_DATE('31122999','DDMMYYYY'))
OVER (PARTITION BY cur_cur_id ORDER BY date_rate), rate,int_rate,stock_rate
FROM exchange_rates)

select * from REPORT_RATES возвращает

2 01.01.2000 24.01.2000 28,5 28,5 28,5
2 24.01.2000 30.11.2000 28,39 28,57 28,39
2 30.11.2000 03.01.2001 27,85 28,8 27,85

А вот этот
select rr.*
from report_rates rr
where rr.cur_cur_id = 2
and to_date('25.01.2000','dd.mm.yyyy') between rr.start_date and rr.end_date

Возвращает вот что ...
1 2 01.01.2000 24.01.2000 28,5 28,5 28,5
2 2 24.01.2000 31.12.2999 28,39 28,57 28,39

Вместо одной записи две ...:(((((((((

Что делать? Как заставить Oracle сначала строить View а только потом накладывать ограничения ...

Заранее благодарен за советы и предложения ...
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32084227
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я по поводу аналитических функций ничего сказать не могу.
Могу сказать только одно, что использование постоянного значения слева от оператора считаю неправильным и считаю это признаком очень низкого уровня.
Может я и не прав.
Код: plaintext
1.
2.
.....
and to_date('25.01.2000','dd.mm.yyyy') between rr.start_date and rr.end_date 
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32084400
Alex_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> softbuilder@inbox.ru

Да ты прав ...
Только это же не реальный код а пример для обозначения проблемы ...
А реальный код несколько по сложнение (конечно могу привести но кому это надо)

Жаль что по существу ничего не можешь сказать :(((
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32084436
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Что делать? Как заставить Oracle сначала строить View а только потом накладывать ограничения ...

Невозможно.
Oracle сначала строит предварительный select с учетом view а затем строит и оптимизирует план.

Может быть поможет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create global temporary table tt_report 
(cur_cur_id ..., 
start_date ..., 
..... end_date, rate, int_rate, stock_rate) ;

insert into tt_report select * from REPORT_RATES ;

select rr.*
from tt_report rr
where rr.cur_cur_id =  2 
and to_date('25.01.2000','dd.mm.yyyy') between rr.start_date and rr.end_date ;

...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32084539
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй сделать materialized view
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32084561
Alex_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShgGena и Nick
Большое спасибо за отклики ....
Конечно, понятно что можно выкрутится сделать временный Table или материализованное View ... Впринципе я и исходную table могу подправить так как мне надо ... Дело то не в этом ...
Вообще я этот способ почерпнул вот отсюда ...
http://www.oracle.com/ru/oramag/may2001/index.html?time_series1.html
У них то вроде бы работает ... Хотелось просто понять что я творю не так ...
Будут мысли всегда рад обсудить ...
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32084577
Alex_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку инфо. по Аналитическим функциям на:
http://www.oracle.com/ru/oramag/september2001/index.html?admin_analyze.html
- подсчет процентов в SQL запросе
- подсчет нарастающего итога ...
- и многое другое ...

p.s. просьба не раценивать это как продвижение ORAMAG ...
Я к ним отношения никого не имею ... просто полезные вещи ... я сам извращался чтоб подсчитать проценты а оказывается это делается очень просто и главное быстро ... )
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085322
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
select * from (
  select * 
  from report_rates
)
where cur_cur_id =  2  
and to_date('25.01.2000','dd.mm.yyyy') between start_date and end_date 


хотя скорее всего получится тоже самое...

а вообще оракл когда работает с view просто подставляет вместо view ее тело , хоть это и оч. упрощенно, это объясняет многое, в т.ч. твой вопрос...

2 softbuilder@inbox.ru,
не мог бы уважаемый объяснить свою не любофф к "[red]использование постоянного значения слева от оператора[/red]" ?
я вот наоборот такой стиль люблю...
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085328
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трудно обьяснить аргументировано. Это примерно также как и правила русского языка - я умею сказать правильно, но не могу обьяснить почему именно так. Что-бы обьяснить, нужно взять школьный учебник и найти это правило. То же самое и с тем что-ты спросил - меня так научили, сейчас мне кажется что это просто истина, которая неоспорима, это просто правило хорошего тона итд итп. Я пишу так уже 10 лет. Но дать документальное доказательство не могу, и наверно не хочу
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085333
Alex_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую Вас MaxU !!!

хотя скорее всего получится тоже самое...

Именно так и ни как иначе ... :(((( (во всяком случаи у меня)

а вообще оракл когда работает с view просто подставляет вместо view ее тело , хоть это и оч. упрощенно, это объясняет многое, в т.ч. твой вопрос...

Полностью согласен ... )

Но почти такой же код приводится в http://www.oracle.com/ru/oramag/may2001/index.html?time_series1.html
и там же утверждается что он работоспособен ...
Может все таки есть какой то способ заставить Oracle работать... а мы пока просто не доросли до этого уровня ...
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085336
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ok,

тогда я вставлю свои 2 евроцента:

во первых многие классики от программирования особенно "насильники" (С/С++) рекомендуют в условиях
Код: plaintext
1.
if (  111  == var ) {}

ставить константу слева от знака сравнения это помогает обнаружить потерянный символ "=".
Т.к. для сравнения в С/С++ используется "==" в том случае когда константа стоит справа при потерянном "=" компилятор выдаст ошибку: "попытка изменить константу" - это краткий экскурс в историю...

теперь касательно
Код: plaintext
to_date('25.01.2000','dd.mm.yyyy') between rr.start_date and rr.end_date
- такая запись ИМХО гораздо более "читабельна" нежели
Код: plaintext
rr.start_date <= to_date('25.01.2000','dd.mm.yyyy') and rr.end_date >= to_date('25.01.2000','dd.mm.yyyy')

другое дело, что некоторые несовершенные оптимизаторы запросов могут выработать лучший план для второй записи, но Оракл, по-моему этим не страдает...
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085344
Alex_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> MaxU
На счет С++ - класный пример, здорово ...
На мой взгляд на счет стиля возражении не должно быть ...
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085358
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alex_D,

было бы намного легче что-либо посоветовать если бы ты привел SQL Script для создания таблиц и наполнения (insert) их тестовыми данными, например

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table exchange_rates (
  cur_cur_id   number
 ,date_rate    date
 ,....
)
/

insert into exchange_rates (cur_cur_id, date_rate, ...) values ( 2 , to_date(...,...));



ЗЫ иногда с аналитическими функциями легче поиграться практически на примере...
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085369
Alex_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaxU да на здоровье ... на поиграйся, что не сделаешь ради человека желающего помочь )

create table EXCHANGE_RATES
(
EXCR_ID NUMBER(10) not null,
CUR_CUR_ID NUMBER(2) not null,
DATE_RATE DATE not null,
RATE NUMBER(12,4) not null,
INT_RATE NUMBER(12,4) default 0 not null,
STOCK_RATE NUMBER(12,4) default 0
);


insert into exchange_rates (excr_id, cur_cur_id, date_rate, rate, int_rate, stock_rate) values (1,2,to_date('17.05.2002','dd.mm.yyyy'),31.55,31.5,0 );
insert into exchange_rates (excr_id, cur_cur_id, date_rate, rate, int_rate, stock_rate) values (2,2,to_date('13.08.2002','dd.mm.yyyy'),31.5612,31.6,0 );
insert into exchange_rates (excr_id, cur_cur_id, date_rate, rate, int_rate, stock_rate) values (3,2,to_date('17.05.2002','dd.mm.yyyy'),31.53,31.6,0 );
insert into exchange_rates (excr_id, cur_cur_id, date_rate, rate, int_rate, stock_rate) values (4,2,to_date('21.08.2002','dd.mm.yyyy'),30,31.7,0 );
insert into exchange_rates (excr_id, cur_cur_id, date_rate, rate, int_rate, stock_rate) values (5,2,to_date('30.08.2002','dd.mm.yyyy'),31.56,31.6,0 );
insert into exchange_rates (excr_id, cur_cur_id, date_rate, rate, int_rate, stock_rate) values (6,2,to_date('03.09.2002','dd.mm.yyyy'),31.65,31.7,0 );
insert into exchange_rates (excr_id, cur_cur_id, date_rate, rate, int_rate, stock_rate) values (7,2,to_date('09.08.2002','dd.mm.yyyy'),31.55,31.5,0 );
insert into exchange_rates (excr_id, cur_cur_id, date_rate, rate, int_rate, stock_rate) values (8,2,to_date('30.08.2002','dd.mm.yyyy'),31.0124,31.0124,0 );
insert into exchange_rates (excr_id, cur_cur_id, date_rate, rate, int_rate, stock_rate) values (9,2,to_date('16.10.2002','dd.mm.yyyy'),31.67,31.9,0 );
insert into exchange_rates (excr_id, cur_cur_id, date_rate, rate, int_rate, stock_rate) values (10,2,to_date('18.10.2002','dd.mm.yyyy'),31.6761,31.85,0 );

CREATE OR REPLACE VIEW REPORT_RATES
(cur_cur_id, start_date, end_date, rate, int_rate, stock_rate)
AS
(SELECT cur_cur_id, date_rate,
LEAD (date_rate, 1, TO_DATE('31122999','DDMMYYYY'))
OVER (PARTITION BY cur_cur_id ORDER BY date_rate), rate,int_rate,stock_rate
FROM exchange_rates);
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085374
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о!
это уже лучше!!!

а какая дата вместо to_date('25.01.2000','dd.mm.yyyy') для приведенных тобой данных тебя интересует?

например взяв наугад 15.08.2002 я получаю в результате:
Код: plaintext
1.
 2 	 13 . 08 . 2002 	 21 . 08 . 2002 	 31 , 5612 	 31 , 6 	 0 


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 2 	 17 . 05 . 2002 	 17 . 05 . 2002 	 31 , 55 	 31 , 5 	 0 
 2 	 17 . 05 . 2002 	 09 . 08 . 2002 	 31 , 53 	 31 , 6 	 0 
 2 	 09 . 08 . 2002 	 13 . 08 . 2002 	 31 , 55 	 31 , 5 	 0 
 2 	 13 . 08 . 2002 	 21 . 08 . 2002 	 31 , 5612 	 31 , 6 	 0 
 2 	 21 . 08 . 2002 	 30 . 08 . 2002 	 30 	 31 , 7 	 0 
 2 	 30 . 08 . 2002 	 30 . 08 . 2002 	 31 , 56 	 31 , 6 	 0 
 2 	 30 . 08 . 2002 	 03 . 09 . 2002 	 31 , 0124 	 31 , 0124 	 0 
 2 	 03 . 09 . 2002 	 16 . 10 . 2002 	 31 , 65 	 31 , 7 	 0 
 2 	 16 . 10 . 2002 	 18 . 10 . 2002 	 31 , 67 	 31 , 9 	 0 
 2 	 18 . 10 . 2002 	 31 . 12 . 2999 	 31 , 6761 	 31 , 85 	 0 


т.е. твой запрос работает в "не измененном" виде

проверял на Oracle8i Enterprise Edition Release 8.1.6.3.0
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085379
Alex_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> MaxU

Макс ты прав, на тестовом примере все Ок ...
Сделал отдельную схемку с данной table и view - все пашет как часы ...

А вот на реальных данных ловлю глюк ...:((( (причем и на тестовой и на рабочей базе Oracle 8.1.7. без патчей)
Сейчас буду копать, может из-за кокого то индекса или еще из-за чего нибудь ...
Буду копать .... о результатах отпишусь ...

Большое спасибо за настоичивость ...
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085380
Alex_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Макс, каюсь в оригинале view вот такая и с ней ловим баг ...

CREATE OR REPLACE VIEW REPORT_RATES
(cur_cur_id, start_date, end_date, rate, int_rate, stock_rate)
AS
((SELECT cur_cur_id, date_rate,
LEAD (date_rate, 1, TO_DATE('31122999','DDMMYYYY'))
OVER (PARTITION BY cur_cur_id ORDER BY date_rate), rate,int_rate,stock_rate
FROM exchange_rates)
union all
select 1, TO_DATE('01.01.1990','DD.MM.YYYY'), TO_DATE('31.12.2999','DD.MM.YYYY'),1,1,1 from dual)

и тогда твой запрос возвращает более 1 записи ...

Какие будут мысли ???
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085426
AndrewY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hi
poprobuy posle SELECT vstavit' hint /*+ ORDERED */
...
Рейтинг: 0 / 0
Аналитические функции на Oracle 8.1.7
    #32085428
AndrewY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Drugoy poleznyy hint /*+ PUSH_SUBQ */
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аналитические функции на Oracle 8.1.7
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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