首页 > 解决方案 > 在 UPDATE / SET 语句中使用 LAG() 计算的值会引发错误

问题描述

我有以下 SQL 语句给我带来了一些麻烦(我对 tsql 很陌生)。

   UPDATE #temp
   SET roe = net_income / LAG(equity, 1) OVER (ORDER BY [year])

   SELECT net_income / ( LAG(equity, 1) OVER (ORDER BY [year]) ) as roe FROM #temp -- this select statement works just fine however.

   SELECT * FROM #temp -- please see picture below for data

在此处输入图像描述

我收到以下错误:Windowed functions can only appear in the SELECT or ORDER BY clauses.

这是什么原因造成的?在 select 语句中运行代码就可以了。

标签: sql-servertsql

解决方案


如前所述,您需要在此处使用可更新的 CTE:

WITH CTE AS(
    SELECT roe,
           net_income / LAG(equity, 1) OVER (ORDER BY [year]) AS NewRoe
    FROM #Temp)
UPDATE CTE
SET roe = NewRoe;

如果 equity可以有一个值0,我还建议将LAG表达式包装在一个NULLIF.


推荐阅读