【问题标题】:MS SQL Window Function LAST_VALUE in five SecondsMS SQL 窗口函数 LAST_VALUE 在五秒内
【发布时间】: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) 但无法控制当时的名声

标签: sql-server sql-server-2012 window-functions


【解决方案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 分钟)时也不起作用。
猜你喜欢
  • 2013-04-22
  • 2021-02-28
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多