|
|
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
Ситуация такова ... Есть 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 а только потом накладывать ограничения ... Заранее благодарен за советы и предложения ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2002, 12:51 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
Я по поводу аналитических функций ничего сказать не могу. Могу сказать только одно, что использование постоянного значения слева от оператора считаю неправильным и считаю это признаком очень низкого уровня. Может я и не прав. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2002, 15:59 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
>> softbuilder@inbox.ru Да ты прав ... Только это же не реальный код а пример для обозначения проблемы ... А реальный код несколько по сложнение (конечно могу привести но кому это надо) Жаль что по существу ничего не можешь сказать :((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2002, 18:59 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
>> Что делать? Как заставить Oracle сначала строить View а только потом накладывать ограничения ... Невозможно. Oracle сначала строит предварительный select с учетом view а затем строит и оптимизирует план. Может быть поможет: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2002, 21:02 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
Попробуй сделать materialized view ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2002, 10:29 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
ShgGena и Nick Большое спасибо за отклики .... Конечно, понятно что можно выкрутится сделать временный Table или материализованное View ... Впринципе я и исходную table могу подправить так как мне надо ... Дело то не в этом ... Вообще я этот способ почерпнул вот отсюда ... http://www.oracle.com/ru/oramag/may2001/index.html?time_series1.html У них то вроде бы работает ... Хотелось просто понять что я творю не так ... Будут мысли всегда рад обсудить ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2002, 10:48 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
В догонку инфо. по Аналитическим функциям на: http://www.oracle.com/ru/oramag/september2001/index.html?admin_analyze.html - подсчет процентов в SQL запросе - подсчет нарастающего итога ... - и многое другое ... p.s. просьба не раценивать это как продвижение ORAMAG ... Я к ним отношения никого не имею ... просто полезные вещи ... я сам извращался чтоб подсчитать проценты а оказывается это делается очень просто и главное быстро ... ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2002, 11:02 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. хотя скорее всего получится тоже самое... а вообще оракл когда работает с view просто подставляет вместо view ее тело , хоть это и оч. упрощенно, это объясняет многое, в т.ч. твой вопрос... 2 softbuilder@inbox.ru, не мог бы уважаемый объяснить свою не любофф к "[red]использование постоянного значения слева от оператора[/red]" ? я вот наоборот такой стиль люблю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2002, 16:20 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
Трудно обьяснить аргументировано. Это примерно также как и правила русского языка - я умею сказать правильно, но не могу обьяснить почему именно так. Что-бы обьяснить, нужно взять школьный учебник и найти это правило. То же самое и с тем что-ты спросил - меня так научили, сейчас мне кажется что это просто истина, которая неоспорима, это просто правило хорошего тона итд итп. Я пишу так уже 10 лет. Но дать документальное доказательство не могу, и наверно не хочу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2002, 16:31 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
Приветствую Вас MaxU !!! хотя скорее всего получится тоже самое... Именно так и ни как иначе ... :(((( (во всяком случаи у меня) а вообще оракл когда работает с view просто подставляет вместо view ее тело , хоть это и оч. упрощенно, это объясняет многое, в т.ч. твой вопрос... Полностью согласен ... ) Но почти такой же код приводится в http://www.oracle.com/ru/oramag/may2001/index.html?time_series1.html и там же утверждается что он работоспособен ... Может все таки есть какой то способ заставить Oracle работать... а мы пока просто не доросли до этого уровня ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2002, 16:35 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
ok, тогда я вставлю свои 2 евроцента: во первых многие классики от программирования особенно "насильники" (С/С++) рекомендуют в условиях Код: plaintext 1. ставить константу слева от знака сравнения это помогает обнаружить потерянный символ "=". Т.к. для сравнения в С/С++ используется "==" в том случае когда константа стоит справа при потерянном "=" компилятор выдаст ошибку: "попытка изменить константу" - это краткий экскурс в историю... теперь касательно Код: plaintext Код: plaintext другое дело, что некоторые несовершенные оптимизаторы запросов могут выработать лучший план для второй записи, но Оракл, по-моему этим не страдает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2002, 16:46 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
>> MaxU На счет С++ - класный пример, здорово ... На мой взгляд на счет стиля возражении не должно быть ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2002, 17:01 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
2 Alex_D, было бы намного легче что-либо посоветовать если бы ты привел SQL Script для создания таблиц и наполнения (insert) их тестовыми данными, например Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ЗЫ иногда с аналитическими функциями легче поиграться практически на примере... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2002, 17:25 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2002, 18:01 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
о! это уже лучше!!! а какая дата вместо to_date('25.01.2000','dd.mm.yyyy') для приведенных тобой данных тебя интересует? например взяв наугад 15.08.2002 я получаю в результате: Код: plaintext 1. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. т.е. твой запрос работает в "не измененном" виде проверял на Oracle8i Enterprise Edition Release 8.1.6.3.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2002, 18:14 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
>> MaxU Макс ты прав, на тестовом примере все Ок ... Сделал отдельную схемку с данной table и view - все пашет как часы ... А вот на реальных данных ловлю глюк ...:((( (причем и на тестовой и на рабочей базе Oracle 8.1.7. без патчей) Сейчас буду копать, может из-за кокого то индекса или еще из-за чего нибудь ... Буду копать .... о результатах отпишусь ... Большое спасибо за настоичивость ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2002, 18:41 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
Макс, каюсь в оригинале 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 записи ... Какие будут мысли ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2002, 19:04 |
|
||
|
Аналитические функции на Oracle 8.1.7
|
|||
|---|---|---|---|
|
#18+
hi poprobuy posle SELECT vstavit' hint /*+ ORDERED */ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2002, 02:35 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32085374&tid=1992315]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 350ms |

| 0 / 0 |
