【发布时间】:2021-01-30 14:53:11
【问题描述】:
我的数据库有这个查询
WITH cte AS (
SELECT
r.CustomerID,
r.DateReceived,
r.Point,
mr.MaxPoint,
COALESCE(SUM(r.Point) OVER (PARTITION BY r.CustomerID ORDER BY r.DateReceived
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) AS cumPoints
FROM Rewards r
INNER JOIN MaxRewards mr ON r.CustomerID = mr.CustomerID
)
SELECT
CustomerID,
DateReceived,
CASE WHEN cumPoints + Point < MaxPoint
THEN Point
ELSE CASE WHEN MaxPoint - cumPoints > 0
THEN MaxPoint - cumPoints ELSE 0 END END AS Point
FROM cte
ORDER BY
CustomerID,
DateReceived;
当我将它部署到另一台仍在使用 SQL 2008 的机器上时,查询 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING 不起作用,有人知道 SQL 2008 的这种语法的等价物吗?
【问题讨论】:
-
旁注:2008 版(以及 2008 R2)现在已经停止扩展支持大约一年了。是时候考虑升级了。
-
同意以上观点。是时候升级了。 2008 可能甚至不再受支持,这意味着它可能存在安全风险。
-
我希望我能哈哈
-
@warheat1990 这根本不是哈哈。 2008 年已停产。主流支持的最早版本是 2016 年。鉴于过去 12 年硬件和软件的差异,您可能使用 SQL Server Express 来处理相同的负载。
-
@warheat1990 如果你不能升级,你将不得不重新设计整个查询,很可能是数据库,以获得足够的性能。窗口函数允许在不需要多次表扫描和存储中间结果的情况下计算运行总数。如果您在 SO 中搜索您的实际问题(计算运行总数),您会找到几个答案,例如
(select sum(c.Points) from Rewards c where c.Customer ID=r.CustomeriD and c.DateReceived<r.DateReceived) - r.Points。不用说,这必须为每一行运行子查询
标签: sql sql-server window-functions