Sql server 计算开始日期和结束日期之间的行数

Sql server 计算开始日期和结束日期之间的行数,sql-server,tsql,Sql Server,Tsql,我有一个有几十万行的表,其中的列包含开始和结束日期时间,类似这样: ID StartDateTime FinishDateTime -------------------------------------------------------- 1 2001-01-01 04:05:06.789 2001-02-03 04:05:06.789 2 2001-01-01 05:05:06.789 2001-01-01 07:05:06.7

我有一个有几十万行的表,其中的列包含开始和结束日期时间,类似这样:

ID    StartDateTime              FinishDateTime
--------------------------------------------------------
1     2001-01-01 04:05:06.789    2001-02-03 04:05:06.789
2     2001-01-01 05:05:06.789    2001-01-01 07:05:06.789
3     2001-01-01 06:05:06.789    2001-02-04 07:05:06.789
4     2001-03-01 06:05:06.789    2001-02-03 04:05:06.789
对于每一行,我需要在开始时计算“活动”行的数量;如在计数每行在startdatetime之前开始和之后结束的行中所示。例如:对于ID=3,startdatetime介于ID=1和ID=2的startdatetime和finishdatetime之间,但不是ID=3或ID=4,因此它应该返回2

所需输出为:

ID    ActiveRows
-----------------
1     0
2     1
3     2
4     0
我可以使用下面的查询让它工作,但运行需要几个小时

select
    ID,
    (select count(1) 
     from table tbl2 
     where tbl2.StartDateTime < tbl.StartDateTime 
       and tbl2.FinishDateTime > tbl.StartDateTime) as 'ActiveRows'
from 
    table tbl
我也试着自己加入到这张桌子上,但它看起来也非常慢

select
    tbl.ID, count(1)
from 
    table tbl
left join table 
    tbl2 on tbl2.StartDateTime < tbl.StartDateTime 
         and tbl2.FinishDateTime > tbl.StartDateTime
group by 
    tbl.ID
执行此计算的最快方法是什么?

您可以使用应用运算符执行此操作


谢谢@prdp。当然要快很多:对于创建了非聚集索引的242180行,14:15。还是很想知道有没有更快的方法@Tim AFAIK,以下是满足您需求的三种可能方式。可能会给你的问题增加悬赏,以获得更多的关注。有人可能会想出更好的办法
SELECT tbl.id, 
       oa.activerows 
FROM   yourtable tbl 
       OUTER apply(SELECT Count(tbl2.id) 
                   FROM   yourtable tbl2 
                   WHERE  tbl2.startdatetime < tbl.startdatetime 
                          AND tbl2.finishdatetime > tbl.startdatetime) oa (activerows) 
Create Nonclustered Index Nix_table on 
      yourtable (startdatetime,finishdatetime) Include (Id)