Advertisement
tonytonov

TimeSeriesElements trigger, key violation

May 15th, 2013
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 8.80 KB | None | 0 0
  1. declare @p1 dbo.TimeSeriesElements_Type
  2. insert into @p1 values(7363,1,'19920410','19920410',10.8700,'20130515 14:05:52','20130514 16:55:13')
  3. insert into @p1 values(7363,1,'19920413','19920413',10.8700,'20130515 14:05:52','20130514 16:55:13')
  4. insert into @p1 values(7363,1,'19920414','19920414',10.8400,'20130515 14:05:52','20130514 16:55:13')
  5. insert into @p1 values(7363,1,'19920415','19920415',10.8300,'20130515 14:05:52','20130514 16:55:13')
  6. insert into @p1 values(7363,1,'19920416','19920416',10.8300,'20130515 14:05:52','20130514 16:55:13')
  7. insert into @p1 values(7363,1,'19920420','19920420',10.9400,'20130515 14:05:52','20130514 16:55:13')
  8. insert into @p1 values(7363,1,'19920421','19920421',10.8300,'20130515 14:05:52','20130514 16:55:13')
  9. insert into @p1 values(7363,1,'19920422','19920422',10.8300,'20130515 14:05:52','20130514 16:55:13')
  10. insert into @p1 values(7363,1,'19920423','19920423',10.9200,'20130515 14:05:52','20130514 16:55:13')
  11. insert into @p1 values(7363,1,'19920424','19920424',10.9900,'20130515 14:05:52','20130514 16:55:13')
  12. -- gives key violation
  13. exec TimeSeriesElements_Insert @param=@p1
  14.  
  15. -- trigger call as a separate query
  16.  
  17. declare @ins      table(TSID                  bigint,
  18.                     TypeID                int,
  19.                 RefDate               datetime,
  20.                 RevDate               datetime,
  21.                 BRefDate              datetime,
  22.                 Value                 decimal(38,10),
  23.                 RN bigint
  24.                 )
  25.                        
  26.     insert into @ins                   
  27. SELECT TSID, TypeId, RefDate, RevDate, RevDate, Value, 0 from @p1
  28.  
  29.  
  30.   declare @ApproxTSElements table(TSID                  bigint,
  31.                                   TypeID                int,
  32.                                   RefDate               datetime,
  33.                                   ApproximationMethodID int,
  34.                                   Value                 decimal(38,10));
  35.  
  36.   --declare @DataForApprox  TDataForApprox;
  37.   create table #DataForApprox (id          int identity(1,1) not null primary key,
  38.                                RefDate1    datetime not null,
  39.                                Value1      decimal(38,10),
  40.                                RefDate2    datetime,
  41.                                Value2      decimal(38, 10),
  42.                                FrequencyID int,
  43.                                TSID        bigint,
  44.                                TypeID      int)
  45.  
  46.   create index #IX_DFA_RefDate1    on #DataForApprox (RefDate1 desc)
  47.   create index #IX_DFA_RefDate2    on #DataForApprox (RefDate2 asc)
  48.   create index #IX_DFA_FrequencyID on #DataForApprox (FrequencyID)
  49.  
  50.   declare @Inserted       TTSElements;
  51.  
  52.   declare @TSElementPairs     TDataForApprox,
  53.           @TimeSeriesElements TTSElements;
  54.           --@RecentTSElements   TTSElements;
  55.    declare @RecentTSElements as table (TSID     bigint   not null,
  56.                                        TypeID   bigint   not null,
  57.                                        RefDate  datetime not null,
  58.                                        RevDate  datetime,
  59.                                        Value    decimal(38,10),
  60.                                        BRefDate datetime,
  61.                                        RN       int      not null,
  62.                                        primary key(TSID, TypeID, RN));
  63.  
  64.   insert into @Inserted(TSID,
  65.                         TypeID,
  66.                         RefDate,
  67.                         RevDate,
  68.                         BRefDate,
  69.                         Value)
  70.     select TSID,
  71.            TypeID,
  72.            RefDate,
  73.            RevDate,
  74.            BRefDate,
  75.            Value
  76.       from @ins;
  77.      
  78.      
  79.       select * from @Inserted
  80.  
  81.   insert into @TimeSeriesElements(TSID, TypeID, RefDate, RevDate, Value, BRefDate)
  82.     select e.TSID, e.TypeID, e.RefDate, e.RevDate, e.Value, e.BRefDate
  83.       from TimeSeriesElements e
  84.              inner join
  85.            (select distinct TSID, TypeID from @ins) i
  86.              on e.TSID   = i.TSID and
  87.                 e.TypeID = i.TypeID
  88.                
  89.   select * from @TimeSeriesElements            
  90.  
  91.   update te
  92.     set BRefDate = fs.BusinessDay
  93.     from @TimeSeriesElements te
  94.            inner join
  95.          TimeSeries t
  96.            on te.TSID = t.TSID
  97.            inner join  
  98.          FrequencySchedules fs
  99.            on t.FrequencyID = fs.FrequencyID and
  100.             te.refdate between fs.firstdate and fs.lastdate
  101.     where te.BRefDate is null
  102.  
  103.   update i
  104.     set BRefDate = fs.BusinessDay
  105.     from @inserted i
  106.            inner join
  107.          TimeSeries t
  108.            on i.TSID = t.TSID
  109.            inner join  
  110.          FrequencySchedules fs
  111.            on t.FrequencyID = fs.FrequencyID and
  112.             i.refdate between fs.firstdate and fs.lastdate
  113.     where i.BRefDate is null
  114.  
  115.   insert into @RecentTSElements(TSID, TypeID, RefDate, RevDate, Value, BRefDate, RN)
  116.     select TSID,
  117.            TypeID,
  118.            RefDate,
  119.            RevDate,
  120.            Value,
  121.            BRefDate,
  122.            RN = ROW_NUMBER() over(partition by TSID, TypeID order by RefDate)
  123.       from (select TSID,
  124.                    TypeID,
  125.                    RefDate,
  126.                    RevDate,
  127.                    Value,
  128.                    BRefDate,
  129.                    mRevDate = max(RevDate) over(partition by TSID, TypeID, RefDate)
  130.               from @TimeSeriesElements
  131.            ) ts
  132.       where RevDate = mRevDate
  133.      
  134.       select * from @RecentTSElements
  135.  
  136.   insert into @TSElementPairs(TSID, TypeID, RefDate1, Value1, RefDate2, Value2, FrequencyID)
  137.     select TSID     = coalesce(e.TSID,   ne.TSID),
  138.            TypeID   = coalesce(e.TypeID, ne.TypeID),
  139.            RefDate1 = e.BRefDate,
  140.            Value1   = e.Value,
  141.            RefDate2 = ne.BRefDate,
  142.            Value2   = ne.Value,
  143.            null
  144.            --ts.FrequencyID
  145.       from @RecentTSElements e
  146.              full join  
  147.            @RecentTSElements ne
  148.              on e.TSID    = ne.TSID   and
  149.                 e.TypeID  = ne.TypeID and
  150.                 e.RN      = ne.RN - 1
  151.              --inner join
  152.            --TimeSeries ts
  153.              --on ts.TSID = coalesce(e.TSID, ne.TSID)
  154.  
  155.   update t
  156.    set FrequencyID = ts.FrequencyID
  157.    from @TSElementPairs t
  158.           inner join
  159.         TimeSeries ts
  160.           on t.TSID = ts.TSID  
  161.  
  162.   insert into #DataForApprox(RefDate1,
  163.                              Value1,
  164.                              RefDate2,
  165.                              Value2,
  166.                              FrequencyID,
  167.                              TSID,
  168.                              TypeID)
  169.     select te.RefDate1,
  170.            te.Value1,
  171.            te.RefDate2,
  172.            te.Value2,
  173.            te.FrequencyID,
  174.            te.TSID,
  175.            te.TypeID
  176.       from @inserted i
  177.              inner join
  178.            @TSElementPairs te
  179.              on i.TSID    = te.TSID   and
  180.                 i.TypeID  = te.TypeID and
  181.                 (
  182.                   i.BRefDate = te.RefDate1
  183.                   or
  184.                   i.BRefDate = te.RefDate2 --and te.RefDate1 is not null
  185.                 ) and
  186.                 te.refdate1 is not null and
  187.                 te.refdate2 is not null
  188.  
  189. select * from #DataForApprox
  190.  
  191.   insert into @ApproxTSElements(TSID, TypeID, RefDate, ApproximationMethodID, Value)
  192.     select TSID,
  193.            TypeID,
  194.            BusinessDay,
  195.            MethodID,
  196.            Value = case MethodID
  197.                      when 1 then Value1 * power (Value2/Value1, convert(float, RN) / (1 + max(RN) over(partition by TSID, TypeID, RefDate1, MethodID)))
  198.                      when 2 then Value1 + RN * (Value2 - Value1) / (1 + max(RN) over(partition by TSID, TypeID, RefDate1, MethodID))
  199.                      when 3 then Value1
  200.                      when 4 then 0
  201.                    end
  202.         from (select d.TSID,
  203.                      d.TypeID,
  204.                      d.RefDate1,
  205.                      s.BusinessDay,
  206.                      --am.MethodID,
  207.                      ts.DefaultInterpolationMethodID as MethodID,
  208.                      d.Value1,
  209.                      d.Value2,
  210.                      --RN = ROW_NUMBER() over(partition by d.TSID, d.TypeID, d.RefDate1, am.MethodID order by s.FirstDate)
  211.                      RN = ROW_NUMBER() over(partition by d.TSID, d.TypeID, d.RefDate1, ts.DefaultInterpolationMethodID order by s.FirstDate)
  212.                 from #DataForApprox d
  213.                        inner join
  214.                      FrequencySchedules s
  215.                        on d.FrequencyID = s.FrequencyID and
  216.                          -- d.RefDate1    < s.FirstDate   and
  217.                          -- d.RefDate2    > s.LastDate
  218.                          s.BusinessDay > d.RefDate1 and s.BusinessDay < d.RefDate2
  219. --                       cross join
  220. --                     ApproximationMethods am) q
  221.                        inner join
  222.                      TimeSeries ts on ts.TSID = d.TSID) q
  223.                          
  224.   delete te
  225.     from ApproxTimeSeriesElements te
  226.            inner join
  227.          @ApproxTSElements t
  228.            on te.TSID    = t.TSID   and
  229.               te.TypeID  = t.TypeID and
  230.               te.RefDate = t.RefDate
  231.  
  232.   delete te
  233.     from ApproxTimeSeriesElements te
  234.            inner join
  235.          #DataForApprox t
  236.            on te.TSID    = t.TSID   and
  237.               te.TypeID  = t.TypeID and
  238.               (  
  239.                 te.RefDate = t.RefDate1
  240.                 or
  241.                 te.RefDate = t.RefDate2
  242.               )
  243.  
  244.   insert into ApproxTimeSeriesElements(TSID, TypeID, RefDate, ApproximationMethodID, Value)
  245.     select TSID, TypeID, RefDate, ApproximationMethodID, Value
  246.       from @ApproxTSElements
  247.  
  248.   drop table #DataForApprox
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement