sql - 在上一行内的相同计算值上创建计算值
问题描述
我正在尝试制作一个脚本来使用基于此表的 SQL 计算“SHI”列。
| Day | BR | BR2 | HI | SHI |
----------------------------------
| 1 | 0 | 0 | 0 | 0 |
| 2 | 400 | 400 | 95 | 95 |
| 3 | 0 | 400 | 0 | 95 |
| 4 | 350 | 750 | 100 | 97.33 |
| 5 | 350 |1100 | 100 | 98.18 |
我需要使用以下方法计算 SHI 列:
SHI = ((BR * HI) + (Prev.SHI * Prev.BR2)) / BR2
需要明确的是,我的数据中尚不存在 SHI 列。这就是我试图让我的查询计算的内容。我的问题是,我不知道如何将之前的 SHI 值插入到当天的公式中。
知道如何在 SQL 中创建它吗?
解决方案
使用 cte,您可以达到您想要的结果。
with cte as
(
select day,br,br2,hi,(case when br2<>0 and br2 is not null then coalesce(round( ((br*hi))/br2,2),0) else 0 end)SHI from S66312677V2 where day=1
union all
select s.day,s.br,s.br2,s.hi,
(case when s.br2<>0 and s.br2 is not null then coalesce(round( ((s.br*s.hi)+cte.shi*cte.br2)/s.br2,2),0) else 0 end)SHI from S66312677V2 s
inner join cte on s.day-1=cte.day
where s.day<>1
)
select * from cte
输出:
如果行数超过 100,则使用OPTION (MAXRECURSION xxx)设置更大的递归限制,最高可达 32,767,如下所示:
with cte as
(
select day,br,br2,hi,(case when br2<>0 and br2 is not null then coalesce(round( ((br*hi))/br2,2),0) else 0 end)SHI from S66312677V2 where day=1
union all
select s.day,s.br,s.br2,s.hi,
(case when s.br2<>0 and s.br2 is not null then coalesce(round( ((s.br*s.hi)+cte.shi*cte.br2)/s.br2,2),0) else 0 end)SHI from S66312677V2 s
inner join cte on s.day-1=cte.day
where s.day<>1
)
select * from cte
OPTION (MAXRECURSION 999)
推荐阅读
- c# - 在 ASP.Net MVC 中没有身份验证的个人用户帐户
- java - 如何从资产文件夹中获取音乐文件的信息?
- sql-server - 仅当两个时间都存在时,计数才应返回
- python - 尝试使用 cx_oracle 从 python 连接 oracle db,并使用安装的 yum list 找到“ppcx_Oracle.i386: Python interface to Oracle”
- angular - 如何使用反应形式从输入中获取字符串
- x86-64 - 为什么不使用 RAX 在 System V AMD64 ABI 中传递参数?
- javascript - 设置 html 表单的选择输入
- c# - 致命:远程错误:需要验证码 - Bitbucket - Powershell 脚本
- java - 将在 netbeans 上创建的 JPanel 添加到另一个以编程方式创建的 Jpanel
- ios - 有时通知会导致 iOS 屏幕刚刚唤醒