Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 объедин. 2 таблиц с версионностью  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1317
Привет всем.

Надо получить итоговю табл. C c полным набором атрибутов, и "пересечением" версионностей, т.е. как только в одной из таблиц Tarifs или Abonents произошла смена версии в C также должна смениться версия. Если версия сменилась одновременно, в обеих таблицах, то в C версия должна смениться один раз.
Tarifs
abon_id tariff_plan type from_date to_date
1 1 1 01OCT2005 01JAN2040
2 1 2 05NOV2005 01DEC2006
2 2 2 02DEC2006 01DEC2007
2 2 1 02DEC2007 01JAN2040
3 0 0 07NOV1917 11JUN1991
3 1 1 12JUN1991 01JAN2040
4 1 1 12JUN1991 01JAN2040

Abonents
abon_id name sex from_date
1 Igor M 01OCT2005 01JAN2040
2 Vasya M 05NOV2005 01AUG2006
2 Lena F 02AUG2006 02SEP2007
2 Yulia F 03SEP2007 01JAN2040
3 USSR Country 07NOV1917 11JUN1991
3 Russia Country 12JUN1991 01JAN2040
4 Petya M 12AUG1991 01JAN2040

1) Через T-sql
2) в идеале чистый SQL без аналит. ф-ций

зы Не то чтобы нужен готовый код - скорей идеи или алгоритм
я реализовал лет 10 назад такое на VFP (xbase) - для расчета учета по телефонам АТС

зы гуглил по интервалам - но там из 1 таблицы - возможно можно как-то адаптирваоть
5 дек 16, 17:41    [19969320]     Ответить | Цитировать Сообщить модератору
 Re: объедин. 2 таблиц с версионностью  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
Гулин Федор,

связать по abon_id и оставить те ТП, которые пересекаются по времени интервал каждого имени.
Дату ОТ оставить наибольшую или равную из пары пересечения тарплан-договор, дату ДО оставить наименьшую или равную. Это при условии, что договор не появился раньше тарифного плана.
5 дек 16, 18:31    [19969542]     Ответить | Цитировать Сообщить модератору
 Re: объедин. 2 таблиц с версионностью  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1317
репрокод
Create table Tarif (  abon_id int , tariff_plan int , typ int  , from_date date , to_date  date ) ;
----------------------------
Create table Abon (  abon_id int, name varchar(60) , sex varchar(10) , from_date  date , to_date  date  );
----------------------------

INSERT INTO Tarif VALUES
(  1,1,1 , '01-OCT-2005', '01-JAN-2040')
, (2,1,2,'05NOV2005','01DEC2006')
, (2,2,2,'02DEC2006','01DEC2007')
, (2,2,1,'02DEC2007','01JAN2040')
, (3,0,0,'07NOV1917','11JUN1991')
, (3,1,1,'12JUN1991','01JAN2040')
, (4,1,1,'12JUN1991','01JAN2040')
;
----------------------------
INSERT INTO Abon VALUES
(1,'Igor','M','01OCT2005','01JAN2040')
, (2,'Vasya','M','05NOV2005','01AUG2006')
, (2,'Lena','F','02AUG2006','02SEP2007')
, (2,'Yulia','F','03SEP2007','01JAN2040')
, (3,'USSR','Country','07NOV1917','11JUN1991')
, (3,'Russia','Country','12JUN1991','01JAN2040')
, (4,'Petya','M','12AUG1991','01JAN2040')
;
5 дек 16, 18:46    [19969598]     Ответить | Цитировать Сообщить модератору
 Re: объедин. 2 таблиц с версионностью  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1317
Владислав Колосов
Гулин Федор,

связать по abon_id и оставить те ТП, которые пересекаются по времени интервал каждого имени.
Дату ОТ оставить наибольшую или равную из пары пересечения тарплан-договор, дату ДО оставить наименьшую или равную. Это при условии, что договор не появился раньше тарифного плана.


я вот думаю как это определить

зы измениться может и табл. Abon - поменялось фио абонента начиная с какой-то даты ( замуж вот вышла девушка )
5 дек 16, 18:47    [19969607]     Ответить | Цитировать Сообщить модератору
 Re: объедин. 2 таблиц с версионностью  [new]
buven
Member

Откуда:
Сообщений: 792
Гулин Федор,

Нарисуйте результирующий набор по вашим входным данным - дело веселее пойдет.
5 дек 16, 19:10    [19969676]     Ответить | Цитировать Сообщить модератору
 Re: объедин. 2 таблиц с версионностью  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1317
buven
Гулин Федор,
Нарисуйте результирующий набор по вашим входным данным - дело веселее пойдет.


результат для 1-х 2 абонентов
(т.е когда меняется тариф или имя абонента то начало следующего дипазаона дата +1 день от конца пред.)
abon_id tariff_plan type name sex from_date to_date

1 1 1 Igor M 01OCT2005 01JAN2040

2 1 2 Vasya M 05NOV2005 01AUG2006
2 1 2 Lena F 02AUG2006 01DEC2006
2 2 2 Yulia F 02DEC2006 02SEP2007
2 2 1 Yulia F 02DEC2007 01JAN2040
5 дек 16, 19:29    [19969732]     Ответить | Цитировать Сообщить модератору
 Re: объедин. 2 таблиц с версионностью  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1317
upd:
1 1 1 Igor M 01OCT2005 01JAN2040

2 1 2 Vasya M 05NOV2005 01AUG2006
2 1 2 Lena F 02AUG2006 01DEC2006
2 2 2 Yulia F 02DEC2006 02SEP2007
2 2 1 Yulia F 03SEP2007 01JAN2040
5 дек 16, 19:31    [19969736]     Ответить | Цитировать Сообщить модератору
 Re: объедин. 2 таблиц с версионностью  [new]
stdvb
Member

Откуда:
Сообщений: 43
Если правильно понял:
select	t.abon_id,
	t.tariff_plan,
	t.typ,
	a.name,
	case when a.from_date > t.from_date then a.from_date else t.from_date end as from_date,
	case when a.to_date < t.to_date then a.to_date else t.to_date end as to_date
from	Abon a
	join Tarif t1 on
		a.abon_id = t1.abon_id and
		a.from_date between t1.from_date and t1.to_date
	join Tarif t2 on 
		a.abon_id = t2.abon_id and
		a.to_date between t2.from_date and t2.to_date
	join Tarif t on
		t.abon_id = a.abon_id and
		t.from_date >= t1.from_date and
		t.to_date <= t2.to_date
6 дек 16, 10:26    [19971035]     Ответить | Цитировать Сообщить модератору
 Re: объедин. 2 таблиц с версионностью  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
declare @Tarif table (  abon_id int , tariff_plan int , typ int  , from_date date , to_date  date ) ;
----------------------------
declare @Abon table (  abon_id int, name varchar(60) , sex varchar(10) , from_date  date , to_date  date  );
----------------------------

INSERT INTO @Tarif VALUES
(  1,1,1 , '01-OCT-2005', '01-JAN-2040')
, (2,1,2,'05NOV2005','01DEC2006')
, (2,2,2,'02DEC2006','01DEC2007')
, (2,2,1,'02DEC2007','01JAN2040')
, (3,0,0,'07NOV1917','11JUN1991')
, (3,1,1,'12JUN1991','01JAN2040')
, (4,1,1,'12JUN1991','01JAN2040')
;
----------------------------
INSERT INTO @Abon VALUES
(1,'Igor','M','01OCT2005','01JAN2040')
, (2,'Vasya','M','05NOV2005','01AUG2006')
, (2,'Lena','F','02AUG2006','02SEP2007')
, (2,'Yulia','F','03SEP2007','01JAN2040')
, (3,'USSR','Country','07NOV1917','11JUN1991')
, (3,'Russia','Country','12JUN1991','01JAN2040')
, (4,'Petya','M','12AUG1991','01JAN2040')

SELECT ab.*, tar.*, 
	CASE 
		WHEN tar.from_date >= ab.from_date THEN tar.from_date
		ELSE ab.from_date
	END tpabon_from_date
FROM @Tarif tar
INNER JOIN @abon ab
ON tar.abon_id = ab.abon_id
WHERE tar.from_date <= ab.to_date
	AND ab.from_date <= tar.to_date
ORDER BY ab.abon_id
6 дек 16, 11:25    [19971373]     Ответить | Цитировать Сообщить модератору
 Re: объедин. 2 таблиц с версионностью  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1317
Владислав Колосов,stdvb
СПАСИБО
на данном датасете оба возвращают то что надо


tar.from_date <= ab.to_date	AND ab.from_date <= tar.to_date

просто - однако я не сообразил.
6 дек 16, 14:50    [19972675]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить