2016-02-16 51 views
0

我在尋找與我下面的問題良好性能的解決方案:選擇時間窗和滑動時間窗口

我有兩個表

  1. 事件表包含的事件和日期此事件
  2. 溫度 - 表包含日期(順序365天開始再見2015年1月1日)和值

第一我想要做的是選擇所有值5天或樂一個事件到一個單獨的表之前SS天,也填補了列eventNumber和daysBeforeEvent

| eventNumber| dayBeforeEv | value  | 
|:-----------|------------:|:------------:| 
| 1   | 1   |  -1  | 
| 1   | 2   |  21  | 
| 1   | 3   |  15  | 
| 1   | 4   |  7  | 
| 1   | 5   |  -7  | 
| 2   | 1   |  -9  | 
| 2   | 2   |  12  | 
| 2   | 3   |  1  | 
| 2   | 4   |  -7  | 
| 2   | 5   |  8  | 
| 3   | 1   |  18  | 
| ...  | ...   |  ...  | 

在第二個表我要選擇在同一構造事件之間的時間所有值。只是我想在這裏使用一種滑動窗口。

Day  |1 |2 |3 |4 |5 |6 |7 |8 |9 |10 | 
Event |X | | | | | | | | |X | 

首先窗口將是從第2天到然後窗口將由一個白天和第二窗口被移動將是從第3天至第7天等 是否會有一個事件的窗口6天 將成爲如縮短從第6天至9天(4天,下一個將只包括3天)

我現在用以下解決方案:

DECLARE @cnt INT = 1; 

WHILE @cnt <= 5 
BEGIN 

INSERT INTO "RESULT" ("EVENT_NUM","EVENT_ID","VALUE","DATE") 
SELECT ROW_NUMBER() OVER (ORDER BY "DATE" ASC) AS ROW,@cnt,"VALUE","DATE" FROM "TEMP_TABLE" 
WHERE "DATE" IN (SELECT DATEADD(day,@cnt*-1,"DATE") FROM "EVENT" ORDER BY "DATE" ASC); 

SET @cnt = @cnt + 1; 

END; 

,直到沒有日期在缺少它工作正常TEMP_Table。但是,當有一定的差距(例如我對2016年2月1日和2016年2月3日,因此2016年2月2日是欠缺的出入)

+0

到目前爲止,我只是想知道它是如何解決的。但我不確定是否有更好的方法。我會用一個嵌套循環的方法。用事件循環遍歷表,並在第二個循環遍歷時間窗口。對於2問題,我只想移動則窗口迭代通過 – Matthias

+0

有一天,你應該編輯您的問題並添加嵌套循環的解決方案,使人們能夠幫助調試,或提供其他建議。 –

+0

這是Oracle嗎? 'ADD_DAYS'? –

回答

0

請修改這個僞答案向我們展示了期望的結果。我認爲它涵蓋了你的問題的第一部分,但第二部分的「窗口」仍不清楚。

declare @Event table (EventId int primary key, EventDate datetime, EventDesc varchar(100)); 
insert into @Event 
    select 1, '2015-10-15', 'Event 1' union all 
    select 2, '2015-11-15', 'Event 2' 

declare @Temp table (TempDate datetime primary key, TempValue int); 
insert into @Temp 
    select '2015-10-12', -1 union all 
    select '2015-10-11', 21 union all 
    select '2015-11-14', 14 

declare @Numbers table (N int primary key); 
insert into @Numbers 
    select 1 union all 
    select 2 union all 
    select 3 union all 
    select 4 union all 
    select 5; 

with stage as 
( select EventId, 
      EventDate, 
      EventDesc, 
      [DaysBeforeEv] = n.n-1, 
      [ThisDate] = dateadd(day, -(n.n-1), EventDate) 
    from @Event 
    cross 
    apply @Numbers n 
    where n.n <= 5 
) 
select * 
from stage s 
left 
join @Temp t on 
     s.ThisDate = t.TempDate 
order 
by  s.EventId, s.ThisDate desc 
+0

我貼一個解決方案了,但仍存在一些問題 – Matthias