【问题标题】:SQL - how to sum groups of 15 rows and find the max sumSQL - 如何对 15 行的组求和并找到最大总和
【发布时间】: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


【解决方案1】:

根据给出的示例,您似乎正在尝试获取滚动总和的最大值。您可以很容易地计算出 15 分钟的滚动总和,如下所示:

SELECT   [Time]
        ,[Value] 
        ,SUM([Value]) OVER (ORDER BY [Time] ASC ROWS 14 PRECEDING) [RollingSum]
FROM    #dataForPeak

注意这里的关键是ROWS 14 PRECEDING 语句。它有效地说明 SQL Server 应该将前面的 14 条记录与当前记录相加,这将为您提供 15 分钟的间隔。 现在您可以简单地最大化滚动总和的结果。完整的查询如下所示:

;WITH CTE_RollingSum
AS
(
    SELECT   [Time]
            ,[Value] 
            ,SUM([Value]) OVER (ORDER BY [Time] ASC ROWS 14 PRECEDING) [RollingSum]
    FROM    #dataForPeak
)
SELECT  MAX([RollingSum]) AS Peak
FROM    CTE_RollingSum

【讨论】:

  • 谢谢!我听说过滚动总和,但不知道它是通过ROWS 实现的。我需要的是 CURRENT ROW / FOLLOWING 关键字,但你的回答肯定很快就把我带到了那里。对于稍后查看此内容的任何人,这是我发现的解释此方法的指南:Sliding aggregation ...如果链接断开...official docs
  • @Camilo 很高兴为您提供帮助
猜你喜欢
  • 1970-01-01
  • 2022-12-12
  • 2018-09-10
  • 2018-04-24
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
相关资源
最近更新 更多