有没有一种方法可以获取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.957533
与0.039514
进行比较的意义上是正确的,我需要0.957533
与1.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
答案 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
)