доброго времени всем
задача на вычисление кол-ва дней по периодам подключения
-- объекты
create table obj(
id integer not null
, name character varying(255)
, description character varying(255)
-- ...
, primary key(id)
);
insert into obj(id, name) values(1, 'собачка Жучка');
insert into obj(id, name) values(2, 'кошка Мурка');
insert into obj(id, name) values(3, 'мышка Тихоня');
insert into obj(id, name) values(4, 'тетя Ася');
-- свойства
create table prop(
id integer not null
, name character varying(255)
, description character varying(255)
, primary key(id)
);
insert into prop(id, name) values(1, 'находится в Сочи');
insert into prop(id, name) values(2, 'дела - неважно');
insert into prop(id, name) values(3, 'на декрете');
insert into prop(id, name) values(4, 'живет припеваюче');
insert into prop(id, name) values(5, 'орет на всех');
insert into prop(id, name) values(6, 'будни');
-- отрезки включения-выключения свойств
-- !!! несмотря на то, что указывается год свойства задаются на все года (то есть периодически повторяются каждый год
-- в пределах указанного отрезка времени)
create table obj_prop_interim(
id integer not null
, obj_id integer
, prop_id integer
, start_d date
, end_d date
);
insert into obj_prop_interim(id, obj_id, prop_id, start_d, end_d) values(1, 1, 1, '2008-01-01', '2008-12-31');
insert into obj_prop_interim(id, obj_id, prop_id, start_d, end_d) values(2, 1, 4, '2008-06-01', '2008-08-31');
insert into obj_prop_interim(id, obj_id, prop_id, start_d, end_d) values(3, 1, 6, '2008-02-01', '2008-03-01');
insert into obj_prop_interim(id, obj_id, prop_id, start_d, end_d) values(4, 1, 6, '2008-07-01', '2008-09-30');
insert into obj_prop_interim(id, obj_id, prop_id, start_d, end_d) values(5, 2, 3, '2008-08-01', '2008-10-31');
insert into obj_prop_interim(id, obj_id, prop_id, start_d, end_d) values(6, 2, 6, '2008-08-01', '2008-08-31');
insert into obj_prop_interim(id, obj_id, prop_id, start_d, end_d) values(7, 3, 6, '2008-01-01', '2008-12-31');
insert into obj_prop_interim(id, obj_id, prop_id, start_d, end_d) values(8, 4, 1, '2008-01-01', '2008-12-31');
insert into obj_prop_interim(id, obj_id, prop_id, start_d, end_d) values(9, 4, 5, '2008-01-01', '2008-12-31');
insert into obj_prop_interim(id, obj_id, prop_id, start_d, end_d) values(10, 4, 2, '2008-01-01', '2008-12-31');
-- постановка задачи
-- дается отрезок времени iFrom:date .. iTo:date
-- нужно вычислить для каждого объекта кол-во пребывания в том или ином качестве(свойстве) за данный отрезок
-- допустим дано iFrom .. iTo = '2008-01-01' .. '2009-10-31'
-- тогда для жучки имеем
объект | состояние | кол-во | собачка Жучка | находится в Сочи | 304 | собачка Жучка | живет припеваюче | 182 | собачка Жучка | будни | 239 |
|
сначала решил в лоб средствами с++ - пересечение множеств (это конечно не подходит в силу статичности)
потом перевел в udf (для каждого объекта вызвается count_days(obj_id)) для большого кол-ва записей работает очень долго (База не важна нужно общее решение) (сам делал на postgres)
буду благодарен за любые идеи