![](/img/trans.png)
[英]SQL Server 2008 version of OVER(… Rows Unbounded Preceding)
[英]SQL Server 2008 equivalent of "ROWS BETWEEN UNBOUNDED PRECEDING"
我对我的数据库有这个查询
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 的等效语法吗?
您绝对应该升级您的 SQL Server。 同时,您可以使用相关子查询:
SELECT r.CustomerID, r.DateReceived, r.Point, mr.MaxPoint,
(SELECT SUM(r2.Point)
FROM rewards r2
WHERE r2.CustomerId = r.CustomerId AND
r2.DateReceived < r.DateReceived
) AS cumPoints
FROM Rewards r JOIN
MaxRewards mr
ON r.CustomerID = mr.CustomerID
这也可以表示为横向连接,使用cross apply
。
这假设DateReceived
没有重复项。 如果那是可能的,那么这就是微妙的不同。
另请注意,性能可能比使用窗口函数差得多,但rewards(customerid, datereceived, point)
的索引会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.