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)