我正在使用SQL Server 2016
并有一个包含以下数据的表格:
我正在尝试构建一个添加列 TransMaxValueContd
的查询到该数据集。
那TransMaxValueContd
列应保留列 TransMaxValue
中遇到的最后一个非零值.
订购由 PlaySeq
完成.
我的预期查询结果是这样的:
我一直在使用像 LAST_VALUE()
这样的窗口函数和LAG()
,但似乎无法得到正确的结果。
也许我把它复杂化了。
有谁知道该怎么做吗?
ps:我只是在寻找查询。无需修改源表。
编辑:添加了 SQLFiddle example尝试失败,即:
SELECT a.PlaySeq,
a.TransMaxValue,
IIF(ISNULL(LAG(a.TransMaxValue,1) OVER (ORDER BY a.PlaySeq), a.TransMaxValue) = a.TransMaxValue, a.TransMaxValue, LAG(a.TransMaxValue,1) OVER (ORDER BY a.PlaySeq)) AS TransMaxValueContd
FROM myTable AS a;
编辑:感谢您的所有回答,它们提供了新的有用见解!
受到answer的启发,我最终使用了这个。来自SteveC .
SELECT a.PlaySeq,
a.TransMaxValue,
(SELECT TOP 1 x.TransMaxValue
FROM myTable AS x
WHERE x.PlaySeq <= a.PlaySeq
AND x.TransMaxValue != 0
ORDER BY x.PlaySeq DESC) AS TransMaxValueContd
FROM myTable AS a;
最佳答案
一种简单的方法是使用OUTER APPLY
和SELECT TOP(1)
。像这样的事情
select m.PlaySeq, m.[TransMaxValue],
case when m.[TransMaxValue]=0
then oa.TransMaxValue
else m.TransMaxValue end TransMaxValueContd
from myTable m
outer apply (select top(1) mm.[TransMaxValue]
from myTable mm
where m.PlaySeq>mm.PlaySeq
and mm.[TransMaxValue]>0
order by mm.PlaySeq desc) oa;
PlaySeq TransMaxValue TransMaxValueContd
1 250 250
2 500 500
3 0 500
4 400 400
5 0 400
6 300 300
7 500 500
8 0 500
9 0 500
关于sql-server - 查询保留最新的非零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66231753/