我可以在没有CURSOR的情况下编写此查询吗?

Leg*_*end 3 sql sql-server query-optimization sql-server-2008

我试图找出在同一类别的另一个表中找到的时间戳的阈值时间内发生的事件数.改变delta的最快方法是什么(在下面给出的情况下,delta是5分钟)?我刚刚使用游标测试了一种方法(将变量设置为5,然后继续递增并执行相同的查询),但每次迭代需要10秒.在我的实际数据中,#EVENTS中的行数大约等于100K,而#CHANGES大约是500K.

我的表格如下:

CREATE TABLE #EVENTS(Category varchar(20), Timestamp datetime)
GO

INSERT INTO #EVENTS VALUES('A', '2013-01-23 05:02:00.000')
INSERT INTO #EVENTS VALUES('A', '2013-01-23 05:04:00.000')
INSERT INTO #EVENTS VALUES('B', '2013-01-23 05:03:00.000')
INSERT INTO #EVENTS VALUES('B', '2013-01-21 05:02:00.000')
GO

CREATE TABLE #CHANGES(Category varchar(10), Timestamp datetime)
GO

INSERT INTO #CHANGES VALUES('A', '2013-01-23 05:00:00.000')
INSERT INTO #CHANGES VALUES('B', '2013-01-21 05:05:00.000')

SELECT *
FROM
(
    SELECT X.Category, X.Timestamp, Y.Timestamp BeforeT, DATEADD(MINUTE, 5, Y.Timestamp) AfterT
    FROM #EVENTS X, #CHANGES Y
    WHERE X.Category = Y.Category
) X
WHERE X.Timestamp BETWEEN BeforeT AND AfterT

DROP TABLE #CHANGES
DROP TABLE #EVENTS
GO
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 6

这是你想要的?它与定义增量的CTE交叉连接:

with deltas as (
     select 5 as delta union all
     select 10 union all
     select 20
)
SELECT *
FROM (SELECT e.Category, e.Timestamp, c.Timestamp BeforeT,
             DATEADD(MINUTE, deltas.delta, c.Timestamp) AfterT,
             deltas.delta
     FROM #EVENTS e join
          #CHANGES c
          on e.Category = c.Category cross join
          deltas
    ) X
WHERE X.Timestamp BETWEEN BeforeT AND AfterT
Run Code Online (Sandbox Code Playgroud)

我还修复了你的别名.当别名与基础表名相关时,查询读取要好得多.