SQL获取上一行的EVALUATED值

时间:2019-07-24 12:38:54

标签: sql sql-server tsql

有没有一种方法可以获取SQL中先前的已评估值?我可以使用LAG来获取行值,但在如何获取计算出的值上却陷入了困境。

我的用例是我正在清理一系列累积数据。期望的输出是,如果当前值小于先前值,则取先前值,否则使用当前值(原因是累积数只能变大)

这是我尝试提出的SQL

SELECT 
 tbl.Date,
 tbl.Location,
 tbl.Report,
 tbl.Product,
 tbl.Value,
 CASE WHEN 
    -- If current value is less than prev value take prev value
    (tbl.Value < (LAG(tbl.Value) OVER (ORDER BY tbl.Location_name,tbl.Report_name,tbl.Product,tbl.Date) ))
        THEN LAG(tbl.Value) OVER (ORDER BY tbl.Location_name,tbl.Report_name,tbl.Product,tbl.Date)
 ELSE tbl.Value
 END AS Value2
 FROM TABLEDATA tbl
)

产生的结果是

Date    Location Report  Product    Value       Value2
Jan     Town A   Output  ASH        0.7         0.7
Feb     Town A   Output  ASH        1.7         1.7
Mar     Town A   Output  ASH        0.039514    1.7
Apr     Town A   Output  ASH        0.957533    0.957533
May     Town A   Output  ASH        2.053009    2.053009
Jun     Town A   Output  ASH        4.68674     4.68674

如果您查看Apr的数据,则该数据应为1.7而不是0.9,但是从某种意义上来说,SQL在将0.9575330.039514进行比较的意义上是正确的,我需要0.9575331.7的评估值进行比较。

正确的输出:

Jan Town A  Output  ASH   0.7           0.7
Feb Town A  Output  ASH   1.7           1.7
Mar Town A  Output  ASH   0.039514      1.7
Apr Town A  Output  ASH   0.957533      1.7
May Town A  Output  ASH   2.053009      2.053009
Jun Town A  Output  ASH   4.68674       4.68674

1 个答案:

答案 0 :(得分:2)

您似乎想要累积最大值,而不是与先前值进行比较。语法为:

MAX(tbl.Value) OVER (ORDER BY tbl.Location_name, tbl.Report_name, tbl.Product, tbl.Date)

也就是说,我猜您真的希望每个位置/报告/产品组合使用此功能。因此,您需要一个PARTITION BY

MAX(tbl.Value) OVER (PARTITION BY tbl.Location_name, tbl.Report_name, tbl.Product
                     ORDER BY tbl.Date
                    )