SQL - OVER子句的范围在2倍之间

时间:2013-03-08 15:17:16

标签: sql range sql-server-2012 between over-clause

我正在尝试使用over函数来计算在所有行的当前行的开始日期和结束日期之间开始的事件数。即并发计数器。最终,我将寻找每天或每小时的最大并发事件等。

select   FingerPrint
        ,StartDate
        ,EndDate
        ,Num_ConCurrent =   count(FingerPrint) over (
                                                    partition by StartDate
                                                    order by StartDate  
                                                    range between StartDate PRECEDING and EndDate following 
        )
from    #File
group by     FingerPrint
            ,StartDate
            ,Enddate

不幸的是,这似乎不起作用。虽然我知道我可以简单地使用自联接,但我认为可能有替代方法使用over子句。

任何帮助都非常感激。

NB:错误消息

Msg 102,Level 15,State 1,Line 7'StartDate'附近的语法不正确。

1 个答案:

答案 0 :(得分:0)

over子句中的Range参数正在查找整数值,而不是列引用。可能有一种方法可以使用over子句来完成它,但我也无法使它工作。

根据我的经验,自我加入一个范围内的日期超级慢,我没有找到正确的索引来加快它。在这种情况下,我只会在内联子查询中使用。

select  FingerPrint,
        StartDate,
        EndDate,
        (select count(FingerPrint)
         from #File F2
         where F2.StartDate between F.StartDate and F.EndDate
        ) 
        as Num_ConCurrent 
        )
from    #File F

针对我拥有的某些约会数据进行一些测试,并使用此方法立即执行32,000行约会。在我停止之前,自我加入运行了15秒。