gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:14:19 24 4
gpt4 key购买 nike

我试图找出在同一类别的另一个表中找到的时间戳的阈值时间内发生的事件数。改变 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

最佳答案

这是您要找的吗?它对定义增量的 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

我还修复了你的别名。当别名与基础表名相关时,查询的阅读效果会好得多。

关于sql - 我可以在没有 CURSOR 的情况下编写此查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14487397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com