首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择时间窗口和滑动时间窗口

选择时间窗口和滑动时间窗口
EN

Stack Overflow用户
提问于 2016-02-16 15:23:06
回答 1查看 119关注 0票数 0

我正在寻找一种性能良好的解决方案,以解决以下问题:

我有两张桌子

  1. 事件-包含事件和此事件日期的表
  2. 温度表,包含日期(从2015-01开始,连续365天)和值

我要做的第一件事是在事件发生前5天或更短的时间内选择所有值,然后填充eventNumber和daysBeforeEvent的列。

代码语言:javascript
复制
| 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       |
| ...        | ...         |     ...      |

在第二个表中,我希望为相同结构中的事件之间的时间选择所有值。我只想在这里用一种滑动窗口。

代码语言:javascript
复制
Day     |1  |2  |3  |4  |5  |6  |7  |8  |9  |10 |
Event   |X  |   |   |   |   |   |   |   |   |X  |

第一个窗口将从第2天移至第6天,第二个窗口将从第3天移动到第7天等,如果发生事件,窗口将变短,例如从第6天到第9天(4天,下一天只包括3天)。

我现在使用以下解决方案:

代码语言:javascript
复制
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-02-01和2016-02-03进入,所以2016-02-02 -02是失踪的)

EN

回答 1

Stack Overflow用户

发布于 2016-02-16 16:59:44

请修改这个伪答案,以显示我们想要的结果。我认为它涵盖了你问题的第一部分,但第二部分的“窗口”还不清楚。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35436363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档