【发布时间】:2018-09-07 13:07:50
【问题描述】:
这个问题的目的是通过使用基于集合的操作与迭代(循环,就像我在下面做的那样)来优化一些 SQL:
一些解释-
我有这个插入到临时表#dataForPeak 的cte。每行代表一分钟,以及检索到的相应值。
对于每一行,我的代码使用 while 循环一次添加 15 行(当前行 + 下 14 行)。这些总和被插入到另一个临时表 #PeakDemandIntervals,这是我找到这些 15 组的最大总和的解决方法。
我在上面加粗了我的最终目标。我的代码实现了这一点,但对于 26k 行大约需要 12 秒。我将查看更多数据,所以我知道这对于我的用例来说还不够。
我的问题是,
- 谁能帮我找到这个循环的快速替代方案?
它可以包含更多的表、CTE、嵌套查询等等。 while 循环甚至可能不是问题,它可能是内部代码。
insert into #dataForPeak
select timestamp, value
from cte
order by timestamp;
while @@ROWCOUNT<>0
begin
declare @timestamp datetime = (select top 1 timestamp from #dataForPeak);
insert into #PeakDemandIntervals
select @timestamp, sum(interval.value) as peak
from (select * from #dataForPeak base
where base.timestamp >= @timestamp
and base.timestamp < DATEADD(minute,14,@timestamp)
) interval;
delete from #dataForPeak where timestamp = @timestamp;
end
select max(peak)
from #PeakDemandIntervals;
编辑
这是我的目标示例,使用 3 分钟而不是 15 分钟为一组。 给定数据:
Time | Value
1:50 | 2
1:51 | 4
1:52 | 6
1:53 | 8
1:54 | 6
1:55 | 4
1:56 | 2
我正在寻找的最大总和(峰值)是 20,因为该组
1:52 | 6
1:53 | 8
1:54 | 6
总和最高。
如果我需要澄清更多,请告诉我。
【问题讨论】:
-
看起来您正在尝试将结果分组为 15 分钟的间隔。如果可能,您应该始终使用基于集合的方法,这看起来像是其中的一个。看链接里的答案:stackoverflow.com/questions/13648693/…
-
样本数据和预期结果
标签: tsql query-optimization sql-server-2016