green_fr: (Default)
green_fr ([personal profile] green_fr) wrote2006-08-08 05:14 pm
Entry tags:

Помогите с SQL


У меня есть таблица с курсами ценных бумаг. Скажем, колонки 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

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

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

[identity profile] aguti.livejournal.com 2006-08-08 03:30 pm (UTC)(link)
Сопровождай такие задачки скриптом создания таблиц(ы). А то ниче не разобрать :)

[identity profile] genem.livejournal.com 2006-08-09 07:25 am (UTC)(link)
Hi,

Я не уверен, что прочитал внимательно :)
Это оно? :

create table green (product int, date int, rate int)

insert into green select 1,5,10
insert into green select 1,4,10
insert into green select 1,3,10
insert into green select 1,2,10
insert into green select 1,1,11
insert into green select 2,5,10
insert into green select 2,4,10
insert into green select 2,3,12
insert into green select 2,2,10
insert into green select 2,1,11
insert into green select 3,5,12
insert into green select 3,4,11
insert into green select 3,3,11


declare @date int

set @date = 5

select product
,min(date) mdate
from green g1
where g1.date < @date
and not exists
(select 1
from green g2
where g2.product = g1.product
and g2.date >= g1.date
and g2.date <= @date
and g2.rate != g1.rate
)
group by product

[identity profile] alexnavfr.livejournal.com 2006-08-09 07:36 am (UTC)(link)
Как тесен мир. Я на прошлой неделе баг искал именно на этом инструменте облиг ABBEY NAT и именно потому что котировок на нем нет и цена не меняется! :))))