Добавить исторические данные для ключевого поля в отдельном столбце (предыдущий контракт) - PullRequest
2 голосов
/ 15 апреля 2019

Я хочу подсчитать, сколько дней требуется клиентам, чтобы переключиться между определенными контрактами.Это может произойти мгновенно или занять много дней, и я хочу отфильтровать дела, которые занимают слишком много времени.

В настоящее время у меня есть набор данных с клиентами (AccountNum), контрактами (ContractId), зданиями, в которых они живут (d) (RentalObjectId).AccountNum может переключать ContractId, а AccountNums может начинать новый ContractId в RentalObjectId, который ранее имел другой AccountNum.Таким образом, данные выглядят следующим образом:

CREATE TABLE PMCCONTRACT (
AccountNum nvarchar(20),
ContractId nvarchar(20),
RentalObjectId nvarchar(20),
ValidFrom date,
ValidTo date);

INSERT INTO PMCCONTRACT (AccountNum, ContractId, RentalObjectId, ValidFrom, ValidTo)
VALUES
('1','HC1','1','43101','43221'),
('2','HC2','2','43101','43252'),
('3','HC3','3','43466','NULL'),
('1','HC4','2','43222','NULL'),
('2','HC5','4','43261','43466'),
('4','HC6','5','43525','NULL');

И вот как я хочу, чтобы они выглядели так:

CREATE TABLE PMCCONTRACTFIX (
AccountNum nvarchar(20),
ContractId nvarchar(20),
RentalObjectId nvarchar(20),
ValidFrom date,
ValidTo date,
PreviousContract nvarchar(20),
PreviousContractValidTo date,
DaysBetweenContracts int);

INSERT INTO PMCCONTRACTFIX (AccountNum, ContractId, RentalObjectId, ValidFrom, ValidTo, PreviousContract, PreviousContractValidTo, DaysBetweenContracts)
VALUES
('1','HC1','1','43101','43221','NULL','NULL','NULL'),
('2','HC2','2','43101','43252','NULL','NULL','NULL'),
('3','HC3','3','43466','NULL','NULL','NULL','NULL'),
('1','HC4','2','43222','NULL','HC1','43221','1'),
('2','HC5','4','43261','43466','HC2','43252','9'),
('4','HC6','5','43525','NULL','NULL','NULL','NULL');

Я не знаю, как начать решать эту проблему.У кого-нибудь есть предложения?

С уважением, Игорь

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Если в аккаунте может быть только один активный контракт, вы можете использовать традиционную структуру типа даты вступления в силу.

Таким образом, ваш план является точной и эффективной датой. Если кто-то меняет контракт, вы ничего не обновляете, вместо этого добавляете строку для этой даты вступления в силу.

Теперь, если вы хотите вернуться, чтобы увидеть мир в любую дату, вы просто найдете запись, которая была эффективной, то есть, где дата вступления в силу в таблице <= желаемая дата. </p>

Поскольку вам также потребуется просматривать текущие записи, создайте представление, которое фильтрует записи, используя функцию текущей даты базы данных.

Тебе даже не понадобится на сегодняшний день. Вместо этого есть столбец, чтобы указать, что контракт расторгнут. Таким образом, вы добавили бы запись с указанием даты расторжения контракта. Создайте таблицу следующим образом

table name = PMCCONTRACT

PK {AccountNum, ContractId, effdte [This is a date column]}
RentalContractId
enabled?

Теперь вы только добавляете строки в таблицу. Вы никогда не обновляете. Всякий раз, когда вы просматриваете данные, вы просматриваете данные «по определенным данным», и их можно считать сегодняшними. Таким образом, ваш sql для получения данных будет:

input = checkEffDte, e.g. today, AccountNum, ContractId

select *
from PMCCONTRACT c1
where c1.AccountNum = :AccountNum
and c1.ContractId = :ContractId
and c1.effdte = ( select max(effdte)
                  from PMCCONTRACT c2
                  where c2.AccountNum = c1.AccountNum
                  and c2.ContractId = c1.ContractId
                  and c2.effdte <= :checkEffDte
                )

Таким образом, вы можете видеть, какой был арендный договор в любой данный день. Вы находите максимальную запись ДО даты вступления в силу.

Вы также можете превратить это в представление - тогда у вас будет быстрый способ просмотреть текущие записи для всех.

0 голосов
/ 15 апреля 2019

Вы можете установить триггер на PMCCONTRACTFIX и обрабатывать столбцы Previous этот код может дать вам некоторое представление:

update p
set PreviousContract=P2.ContractId  , PreviousContractValidTo=p2.ValidTo,DaysBetweenContracts=(P2.ValidFrom-P2.ValidTo)
from PMCCONTRACTFIX P
               left join PMCCONTRACTFIX P2 on p.AccountNum=p2.AccountNum
               left join (select AccountNum,MAx(ContractId) ContractId from PMCCONTRACTFIX  Group by AccountNum ) X on X.ContractId = P2.ContractId 

но помните, что вы не можете использовать это после триггера

Select p. *,P2.ContractId  , p2.ValidTo,(P2.ValidFrom-P2.ValidTo)
from PMCCONTRACTFIX P
               left join PMCCONTRACTFIX P2 on p.AccountNum=p2.AccountNum
               left join (select AccountNum,MAx(ContractId) ContractId from PMCCONTRACTFIX  Group by AccountNum ) X on X.ContractId = P2.ContractId 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...