sql-server - 查询保留最新的非零值

标签 sql-server t-sql sql-server-2016

我正在使用SQL Server 2016并有一个包含以下数据的表格:

<表类=“s-表”> <标题> PlaySeq TransMaxValue <正文> 1 250 2 500 3 0 4 400 5 0 6 300 7 500 8 0 9 0

我正在尝试构建一个添加列 TransMaxValueContd 的查询到该数据集。
TransMaxValueContd列应保留列 TransMaxValue 中遇到的最后一个非零值.
订购由 PlaySeq 完成.

我的预期查询结果是这样的:

<表类=“s-表”> <标题> 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

我一直在使用像 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 APPLYSELECT 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/

相关文章:

asp.net session 状态模式 "SQLServer"

sql - 如何在单个 sql 语句中组合更新和删除而不通过索引约束?

sql-server - Microsoft.SqlServer.ManagedDTS.dll SQL Server 2016 位置

sql-server - 在 linux VM 上托管的 sql server 上恢复备份

sql-server - SSIS组件故障无法工作

sql-server - 根据输入的年份 SQL Server 和 SSRS 计算财政年度的开始和结束日期

SQL Server - 在每个组中添加页眉和页脚字段

sql-server - 使用 t-sql 选择删除重复值的数据集

sql - 如何找到一个数字的范围,其中范围动态来自另一个表?

python - MSSQL 连接字符串 - 使用另一组凭据的 Windows 身份验证