Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- declare @p1 dbo.TimeSeriesElements_Type
- insert into @p1 values(7363,1,'19920410','19920410',10.8700,'20130515 14:05:52','20130514 16:55:13')
- insert into @p1 values(7363,1,'19920413','19920413',10.8700,'20130515 14:05:52','20130514 16:55:13')
- insert into @p1 values(7363,1,'19920414','19920414',10.8400,'20130515 14:05:52','20130514 16:55:13')
- insert into @p1 values(7363,1,'19920415','19920415',10.8300,'20130515 14:05:52','20130514 16:55:13')
- insert into @p1 values(7363,1,'19920416','19920416',10.8300,'20130515 14:05:52','20130514 16:55:13')
- insert into @p1 values(7363,1,'19920420','19920420',10.9400,'20130515 14:05:52','20130514 16:55:13')
- insert into @p1 values(7363,1,'19920421','19920421',10.8300,'20130515 14:05:52','20130514 16:55:13')
- insert into @p1 values(7363,1,'19920422','19920422',10.8300,'20130515 14:05:52','20130514 16:55:13')
- insert into @p1 values(7363,1,'19920423','19920423',10.9200,'20130515 14:05:52','20130514 16:55:13')
- insert into @p1 values(7363,1,'19920424','19920424',10.9900,'20130515 14:05:52','20130514 16:55:13')
- -- gives key violation
- exec TimeSeriesElements_Insert @param=@p1
- -- trigger call as a separate query
- declare @ins table(TSID bigint,
- TypeID int,
- RefDate datetime,
- RevDate datetime,
- BRefDate datetime,
- Value decimal(38,10),
- RN bigint
- )
- insert into @ins
- SELECT TSID, TypeId, RefDate, RevDate, RevDate, Value, 0 from @p1
- declare @ApproxTSElements table(TSID bigint,
- TypeID int,
- RefDate datetime,
- ApproximationMethodID int,
- Value decimal(38,10));
- --declare @DataForApprox TDataForApprox;
- create table #DataForApprox (id int identity(1,1) not null primary key,
- RefDate1 datetime not null,
- Value1 decimal(38,10),
- RefDate2 datetime,
- Value2 decimal(38, 10),
- FrequencyID int,
- TSID bigint,
- TypeID int)
- create index #IX_DFA_RefDate1 on #DataForApprox (RefDate1 desc)
- create index #IX_DFA_RefDate2 on #DataForApprox (RefDate2 asc)
- create index #IX_DFA_FrequencyID on #DataForApprox (FrequencyID)
- declare @Inserted TTSElements;
- declare @TSElementPairs TDataForApprox,
- @TimeSeriesElements TTSElements;
- --@RecentTSElements TTSElements;
- declare @RecentTSElements as table (TSID bigint not null,
- TypeID bigint not null,
- RefDate datetime not null,
- RevDate datetime,
- Value decimal(38,10),
- BRefDate datetime,
- RN int not null,
- primary key(TSID, TypeID, RN));
- insert into @Inserted(TSID,
- TypeID,
- RefDate,
- RevDate,
- BRefDate,
- Value)
- select TSID,
- TypeID,
- RefDate,
- RevDate,
- BRefDate,
- Value
- from @ins;
- select * from @Inserted
- insert into @TimeSeriesElements(TSID, TypeID, RefDate, RevDate, Value, BRefDate)
- select e.TSID, e.TypeID, e.RefDate, e.RevDate, e.Value, e.BRefDate
- from TimeSeriesElements e
- inner join
- (select distinct TSID, TypeID from @ins) i
- on e.TSID = i.TSID and
- e.TypeID = i.TypeID
- select * from @TimeSeriesElements
- update te
- set BRefDate = fs.BusinessDay
- from @TimeSeriesElements te
- inner join
- TimeSeries t
- on te.TSID = t.TSID
- inner join
- FrequencySchedules fs
- on t.FrequencyID = fs.FrequencyID and
- te.refdate between fs.firstdate and fs.lastdate
- where te.BRefDate is null
- update i
- set BRefDate = fs.BusinessDay
- from @inserted i
- inner join
- TimeSeries t
- on i.TSID = t.TSID
- inner join
- FrequencySchedules fs
- on t.FrequencyID = fs.FrequencyID and
- i.refdate between fs.firstdate and fs.lastdate
- where i.BRefDate is null
- insert into @RecentTSElements(TSID, TypeID, RefDate, RevDate, Value, BRefDate, RN)
- select TSID,
- TypeID,
- RefDate,
- RevDate,
- Value,
- BRefDate,
- RN = ROW_NUMBER() over(partition by TSID, TypeID order by RefDate)
- from (select TSID,
- TypeID,
- RefDate,
- RevDate,
- Value,
- BRefDate,
- mRevDate = max(RevDate) over(partition by TSID, TypeID, RefDate)
- from @TimeSeriesElements
- ) ts
- where RevDate = mRevDate
- select * from @RecentTSElements
- insert into @TSElementPairs(TSID, TypeID, RefDate1, Value1, RefDate2, Value2, FrequencyID)
- select TSID = coalesce(e.TSID, ne.TSID),
- TypeID = coalesce(e.TypeID, ne.TypeID),
- RefDate1 = e.BRefDate,
- Value1 = e.Value,
- RefDate2 = ne.BRefDate,
- Value2 = ne.Value,
- null
- --ts.FrequencyID
- from @RecentTSElements e
- full join
- @RecentTSElements ne
- on e.TSID = ne.TSID and
- e.TypeID = ne.TypeID and
- e.RN = ne.RN - 1
- --inner join
- --TimeSeries ts
- --on ts.TSID = coalesce(e.TSID, ne.TSID)
- update t
- set FrequencyID = ts.FrequencyID
- from @TSElementPairs t
- inner join
- TimeSeries ts
- on t.TSID = ts.TSID
- insert into #DataForApprox(RefDate1,
- Value1,
- RefDate2,
- Value2,
- FrequencyID,
- TSID,
- TypeID)
- select te.RefDate1,
- te.Value1,
- te.RefDate2,
- te.Value2,
- te.FrequencyID,
- te.TSID,
- te.TypeID
- from @inserted i
- inner join
- @TSElementPairs te
- on i.TSID = te.TSID and
- i.TypeID = te.TypeID and
- (
- i.BRefDate = te.RefDate1
- or
- i.BRefDate = te.RefDate2 --and te.RefDate1 is not null
- ) and
- te.refdate1 is not null and
- te.refdate2 is not null
- select * from #DataForApprox
- insert into @ApproxTSElements(TSID, TypeID, RefDate, ApproximationMethodID, Value)
- select TSID,
- TypeID,
- BusinessDay,
- MethodID,
- Value = case MethodID
- when 1 then Value1 * power (Value2/Value1, convert(float, RN) / (1 + max(RN) over(partition by TSID, TypeID, RefDate1, MethodID)))
- when 2 then Value1 + RN * (Value2 - Value1) / (1 + max(RN) over(partition by TSID, TypeID, RefDate1, MethodID))
- when 3 then Value1
- when 4 then 0
- end
- from (select d.TSID,
- d.TypeID,
- d.RefDate1,
- s.BusinessDay,
- --am.MethodID,
- ts.DefaultInterpolationMethodID as MethodID,
- d.Value1,
- d.Value2,
- --RN = ROW_NUMBER() over(partition by d.TSID, d.TypeID, d.RefDate1, am.MethodID order by s.FirstDate)
- RN = ROW_NUMBER() over(partition by d.TSID, d.TypeID, d.RefDate1, ts.DefaultInterpolationMethodID order by s.FirstDate)
- from #DataForApprox d
- inner join
- FrequencySchedules s
- on d.FrequencyID = s.FrequencyID and
- -- d.RefDate1 < s.FirstDate and
- -- d.RefDate2 > s.LastDate
- s.BusinessDay > d.RefDate1 and s.BusinessDay < d.RefDate2
- -- cross join
- -- ApproximationMethods am) q
- inner join
- TimeSeries ts on ts.TSID = d.TSID) q
- delete te
- from ApproxTimeSeriesElements te
- inner join
- @ApproxTSElements t
- on te.TSID = t.TSID and
- te.TypeID = t.TypeID and
- te.RefDate = t.RefDate
- delete te
- from ApproxTimeSeriesElements te
- inner join
- #DataForApprox t
- on te.TSID = t.TSID and
- te.TypeID = t.TypeID and
- (
- te.RefDate = t.RefDate1
- or
- te.RefDate = t.RefDate2
- )
- insert into ApproxTimeSeriesElements(TSID, TypeID, RefDate, ApproximationMethodID, Value)
- select TSID, TypeID, RefDate, ApproximationMethodID, Value
- from @ApproxTSElements
- drop table #DataForApprox
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement