MS SQL 窗口函数 LAST_VALUE 在五秒内

Posted

技术标签:

【中文标题】MS SQL 窗口函数 LAST_VALUE 在五秒内【英文标题】:MS SQL Window Function LAST_VALUE in five Seconds 【发布时间】:2015-12-01 13:28:26 【问题描述】:

我已经得到了下一个数据Id,接收和余额

现在我需要计算每个时间段的最后一列,所以最后一列应该是接下来五秒内余额列的最后一个值。

Id  Received    Balance     LastPerFiveSeconds
171 2015-11-25 10:05:50.630 13548830.86000000   15026517.59000000
172 2015-11-25 10:05:50.760 13590759.43000000   15026517.59000000
173 2015-11-25 10:05:50.790 13632688.00000000   15026517.59000000
174 2015-11-25 10:05:50.850 13662038.00000000   15026517.59000000
175 2015-11-25 10:05:50.910 13687195.15000000   15026517.59000000
176 2015-11-25 10:05:50.940 13703966.58000000   15026517.59000000
177 2015-11-25 10:05:50.950 13720738.01000000   15026517.59000000
178 2015-11-25 10:05:50.990 13762666.59000000   15026517.59000000
179 2015-11-25 10:05:51.060 13787823.73000000   15026517.68000000
180 2015-11-25 10:05:51.200 14987823.73000000   15026517.68000000
181 2015-11-25 10:05:51.360 15026517.68000000   15026517.68000000
182 2015-11-25 10:05:56.630 15034903.39000000   15034903.39000000

查询看起来像这样

SELECT id, Received, Balance, LAST_VALUE(Balance) OVER (PARTITION BY DATEADD(S, 5, [Received]) ORDER BY Received  RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM Data

【问题讨论】:

您的问题是什么?请把你的“得到”和“需要”分开。 你的意思是 5 秒而不是 5 分钟? 这个问题没有显示任何研究工作。 我需要使用 Received 作为时间窗口从余额中计算 LastPerFiveMinute @TabAlleman 我正在使用 LAST_VALUE(Balance) OVER (ORDER BY Received RANGE BETWEEN UNBOUNDED PRECEDING 和 UNBOUNDED FOLLOWING) 但无法控制当时的名声 【参考方案1】:

您可以使用CROSS APPLY 来实现您想要的。它将查看未来五分钟内的余额并选择最近的余额:

SELECT do.Id ,
      do.Received ,
      do.Balance ,
      ISNULL(details.Balance,do.Balance) AS LastPerFiveMinute
FROM      dbo.data do
      OUTER APPLY ( SELECT TOP 1
                         Balance
                 FROM    dbo.Data di
                 WHERE   di.Received <= DATEADD(MINUTE, 5,
                                            do.Received)
                         AND di.Received >= do.Received
                 ORDER BY    Received DESC
                ) details
ORDER BY Received ASC   

【讨论】:

非常好的答案,问题是在更大的数据集中会运行很长时间,我在这个数据集上有数千个事务,这就是我考虑使用窗口函数的原因 不太正确 14112552 是 '20151201 15:45:00' 和 14112553 for 2015-12-01 15:49:59.000 的结果,因此它们在 5 分钟内,但该因素会对它们进行不同的分组 您不能在您的情况下使用LAST_VALUE,因为它目前可能不是特定的RANGE 值。 LAST_VALUE 在数据集中有间隔(>5 分钟)时也不起作用。

以上是关于MS SQL 窗口函数 LAST_VALUE 在五秒内的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MS SQL 中将 last_value 与 group by 结合使用?

SQL Server ->> FIRST_VALUE和LAST_VALUE函数

sql SQL Server 2012 TSQL新函数LAG,LEAD,FIRST_VALUE和LAST_VALUE

窗口分析函数19_Mysql查询窗口函数里第一个最后一个第N个元素的值值案例详解(FIRST_VALUE LAST_VALUE NVH_VALUE)

MySql窗口函数

雪花窗函数 last_value 和 max