繁体   English   中英

SQL Server 2008 等效于“ROWS BETWEEN 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM