green_fr: (Default)
[personal profile] green_fr

У меня есть таблица с курсами ценных бумаг. Скажем, колонки POS_DARR, POS_COD и POS_COURS для даты, кода бумаги и курса.
В программе, заполняющей эту таблицу могут быть баги, когда курс застывает на некотором значении, и перестаёт обновляться, т.е. начиная со дня баги курс будет равен одному и тому же значению.
Мне нужно вывести все подозрительные линии, т.е. для некоторой даты вывести все коды, курсы которых не изменились по крайней мере со вчерашнего дня (халява), а затем дату, с которой этот курс оставался неизменным.

Я написал следующего монстра (POSITION - таблица курсов, код не в одной колонке POS_COD, а в двух POS_PTF_COD и POS_VAL_COD, INTEGRATION - список всех дат базы данных):

select pos_darr, min(int_darr), pos_ptf_cod, pos_val_cod, pos_cours
from (
select pos1.pos_darr, int_darr, pos1.pos_ptf_cod, pos1.pos_val_cod, pos1.pos_cours
from position pos1, position pos2, integration
where pos1.pos_darr = '20/07/2006'
and pos1.pos_val_cod = 'FR0000108664'
and pos1.pos_ptf_cod = '1000101'
and pos1.pos_ptf_cod = pos2.pos_ptf_cod
and pos1.pos_val_cod = pos2.pos_val_cod
and int_darr < pos1.pos_darr
and pos1.pos_darr > pos2.pos_darr
and int_darr <= pos2.pos_darr
group by pos1.pos_darr, pos1.pos_ptf_cod, pos1.pos_val_cod, pos1.pos_cours, int_darr
having min(pos2.pos_cours) = max(pos2.pos_cours)
)
group by pos_darr, pos_ptf_cod, pos_val_cod, pos_cours

Монстра работает, конечно, но только когда я запрашиваю один код (как это сдалено в примере). Когда прошу много - думает тормозит. Неудивительно, впрочем. Есть какие-то идеи, как вообще такие вещи пишутся?

Можно, конечно, писать не запрос, а цикл, который пробегает по курсору... Но хочется красиво как-то.

Date: 2006-08-08 03:34 pm (UTC)
From: [identity profile] aguti.livejournal.com
Желательно с группой соотвествующих инсертов :)

Date: 2006-08-08 03:57 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Вот:
create table POSITION
(
POS_DARR DATE not null,
POS_PTF_COD VARCHAR2(10) not null,
POS_VAL_COD VARCHAR2(15) not null,
POS_COURS NUMBER(17,6)
);

create table INTEGRATION
(
INT_DARR DATE not null
);

insert into INTEGRATION (INT_DARR)
values (to_date('20-07-2006', 'dd-mm-yyyy'));
insert into INTEGRATION (INT_DARR)
values (to_date('19-07-2006', 'dd-mm-yyyy'));
insert into INTEGRATION (INT_DARR)
values (to_date('18-07-2006', 'dd-mm-yyyy'));
insert into INTEGRATION (INT_DARR)
values (to_date('17-07-2006', 'dd-mm-yyyy'));

insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('20-07-2006', 'dd-mm-yyyy'), '1', '1', 10);
insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('19-07-2006', 'dd-mm-yyyy'), '1', '1', 10);
insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('18-07-2006', 'dd-mm-yyyy'), '1', '1', 12);
insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('17-07-2006', 'dd-mm-yyyy'), '1', '1', 10);
insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('20-07-2006', 'dd-mm-yyyy'), '1', '2', 10);
insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('19-07-2006', 'dd-mm-yyyy'), '1', '2', 10);
insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('18-07-2006', 'dd-mm-yyyy'), '1', '2', 10);
insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('17-07-2006', 'dd-mm-yyyy'), '1', '2', 10);
insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('20-07-2006', 'dd-mm-yyyy'), '1', '3', 10);
insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('19-07-2006', 'dd-mm-yyyy'), '1', '3', 12);
insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('18-07-2006', 'dd-mm-yyyy'), '1', '3', 12);
insert into POSITION (POS_DARR, POS_PTF_COD, POS_VAL_COD, POS_COURS)
values (to_date('17-07-2006', 'dd-mm-yyyy'), '1', '3', 10);

Запрос на 20/07/2006 должен выдать:

POS_PTF_COD POS_VAL_COD DATE_START
1 1 19/07/2006
1 2 17/07/2006

Пара (1, 3) в списке не должна фигурировать, поскольку курс в последний день изменился.

Profile

green_fr: (Default)
green_fr

May 2025

S M T W T F S
    1 23
4 5 678910
11 12 1314 15 1617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 29th, 2025 03:01 pm
Powered by Dreamwidth Studios