【问题标题】:SQL Server 2008 equivalent of "ROWS BETWEEN UNBOUNDED PRECEDING"SQL Server 2008 等效于“ROWS BETWEEN UNBOUNDED PRECEDING”
【发布时间】: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&lt;r.DateReceived) - r.Points。不用说,这必须为每一行运行子查询

标签: sql sql-server window-functions


【解决方案1】:

您绝对应该升级您的 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) 上的索引会有所帮助。

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 2021-02-03
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2015-01-03
    • 2019-08-31
    相关资源
    最近更新 更多