选择条目窗口

rai*_*nes 3 sql oracle oracle11g

考虑以下(简称)表:

ID           NUMBER
PROD_NO      VARCHAR2(10)
START_TIME   DATE
Run Code Online (Sandbox Code Playgroud)

我想要做的是在给定的START_TIME周围选择一个大小为n的行的"窗口".

例:

ID   PROD_NO   START_TIME
...
42   1234567   2012-02-28 13:42:10
43   1234568   2012-02-28 13:47:53
44   1234569   2012-02-28 13:52:22
45   1234570   2012-02-28 13:59:01
46   1234571   2012-02-28 14:02:12
47   1234572   2012-02-28 14:05:19
... 
Run Code Online (Sandbox Code Playgroud)

如果START_TIME ='2012-02-28 14:00:00'且窗口大小n = 4,则生成的行集应为ID 44 ... 47.

不能假定条目按START_TIME排序.如果没有足够的条目可用于匹配指定的窗口大小,则可以裁剪它.

由于我的SQL技能非常有限,任何帮助都将非常感激.

提前致谢.

Joh*_*yle 5

您可以使用分析函数来帮助解决此问题:

select WT.ID
  from (select WT.ID
              ,max(
                 START_TIME)
               over (order by START_TIME
                     rows between 2 preceding and 2 following)
                 as MAXST
              ,min(
                 START_TIME)
               over (order by START_TIME
                     rows between 2 preceding and 2 following)
                 as MINST
          from WT) WT
 where MINST < to_date('2012-02-28 14:00:00', 'yyyy-mm-dd hh24:mi:ss')
       and MAXST > to_date('2012-02-28 14:00:00', 'yyyy-mm-dd hh24:mi:ss')
Run Code Online (Sandbox Code Playgroud)