【发布时间】:2015-09-08 07:34:14
【问题描述】:
我正在尝试编写一个将计算表数据插入另一个表的过程。
我遇到的问题是我需要每一行的计算列受到前一行计算列的结果的影响。我试图滞后计算本身,但这不起作用!
如:
(Max 是我创建的一个函数,它返回两个值中的最大值)
Id Product Model Column1 Column2
1 A 1 5 =MAX(Column1*2, Lag(Column2))
2 A 2 2 =MAX(Column1*2, Lag(Column2))
3 B 1 3 =MAX(Column1*2, Lag(Column2))
如果我在 SQL 中尝试上述操作:
SELECT
Column1,
MyMAX(Column1,LAG(Column2, 1, 0) OVER (PARTITION BY Product ORDER BY Model ASC) As Column2
FROM Source
...它说 column2 是未知的。
如果我 LAG Column2 计算得到的输出:
Select Column1, MyMAX(Column1,LAG(Column1*2, 1, 0) OVER (PARTITION BY Product ORDER BY Model ASC) As Column2
Id Column1 Column2
1 5 10
2 2 10
3 3 6
为什么第 3 行有 6 个?因为 3*2 > 2*2。
我想要的输出:
Id Column1 Column2
1 5 10
2 2 10
3 3 10
为什么第 3 行有 10 个?因为之前的结果 10 > 3*2
问题是我不能滞后 Column2 的结果 - 我只能滞后其他列或它们的计算!
是否有使用 LAG 实现此目的的技术,或者我必须使用递归 CTE 吗?我读到 LAG 成功了 CTE,所以我认为这是可能的。如果不是,这个“CTE”会是什么样子?
编辑:或者,我还能做些什么来解决这个计算?
【问题讨论】:
-
您能否提供您的实际查询。 Lag 需要
OVER()子句,而Sql-Server 的MAX不像MySql's GREATEST 那样工作 -
这是一个 CLR 函数还是什么?当内置 MAX 函数已经存在时,您是如何创建一个名为 MAX 的函数的?如何在没有架构的情况下调用它而不出错?
-
感谢 cmets - 这尚未实施,因为我无法找到解决此初始问题的方法。问题中的示例尽可能简单,以便我理解问题。一旦我找到了解决方案,我会将我学到的知识应用到我的解决方案中。我进行了一些修改以提高清晰度。
-
您不能在创建它的查询中通过别名来引用计算列。
标签: sql sql-server recursion