sql-server - 在 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 语句中运行代码就可以了。
解决方案
如前所述,您需要在此处使用可更新的 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
.
推荐阅读
- php - 使用 URL 发送 POST 数据
- python - matplotlib 标题中内联字符串中符号上方的单词
- python-3.x - 显示从linux入口点执行的python脚本的控制台?
- java - 如何在 Java 中使用 xdg-desktop-portal 文件门户
- sql-server - 未激活电子邮件的作业失败的 SQL Server 代理
- c - 为什么我用两种方法检查一个数字是否是阿姆斯壮数字会得到不同的结果?
- docker - Filebeat 不尝试连接到 backoff/Logstash 并且没有日志发送到 Logstash
- python-3.x - 尝试在序列化程序“CommentSerializer”上获取字段“文本”的值时出现 AttributeError
- javascript - CSS 和 Javascript 中的通知动画
- php - Symfony Mercure 错误 Symfony\Component\Mercure\PublisherInterface