我在尋找與我下面的問題良好性能的解決方案:選擇時間窗和滑動時間窗口
我有兩個表
- 事件表包含的事件和日期此事件
- 溫度 - 表包含日期(順序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日是欠缺的出入)
到目前爲止,我只是想知道它是如何解決的。但我不確定是否有更好的方法。我會用一個嵌套循環的方法。用事件循環遍歷表,並在第二個循環遍歷時間窗口。對於2問題,我只想移動則窗口迭代通過 – Matthias
有一天,你應該編輯您的問題並添加嵌套循環的解決方案,使人們能夠幫助調試,或提供其他建議。 –
這是Oracle嗎? 'ADD_DAYS'? –