【发布时间】:2017-07-10 16:02:33
【问题描述】:
我进行了以下涉及 LAG() 的计算:
(lag(fValue,1,fValue) OVER (PARTITION BY Cluster ORDER BY iSequence) + fValue) / 2 as fValueAjusted
它取上一个(基于 iSequence)记录的 fValue,与当前记录相加,然后除以 2。
但是,我必须使用先前记录的 fValueAjusted,而不是使用 fValue。
这意味着第一条记录的 fValueAjusted 将是它自己的 fValue。第二条记录的 fValueAjusted 将基于第一条记录的 fValue。并且,从第三条记录开始,将根据前一条记录的fValueAjusted计算。
我需要在上一条记录的 fValueAjusted 上递归计算 fValueAjusted。我不知道该怎么做。
更新 1:这是源数据的示例。真实表有数百条记录和80个簇。
CREATE TABLE dbo.example (
iUnity int NOT NULL,
Cluster char(2) NOT NULL,
fValue float NOT NULL
)
15 A1 150
17 A1 170
21 B2 210
23 B2 230
71 C3 710
这是计算序列的 CTE:
WITH cteSequencing AS (
SELECT
iUnity,Cluster
,fValue as fValueOriginal
,row_number() OVER (PARTITION BY Cluster ORDER BY fValueOriginal) as iSequence
FROM dbo.example
)
如果 fValueAjusted 将基于 fValueOriginal 计算,查询将如下所示:
SELECT
iUnity,Cluster,fValueOriginal
,(
lag(fValue,1,fValue) OVER (PARTITION BY Cluster ORDER BY iSequence)
+ fValueOriginal
) / 2 as fValueAjusted
FROM cteSequencing
但一条记录的 fValueAjusted 必须根据前一条记录的 fValueAjusted 计算。它会是这样的:
SELECT
iUnity,Cluster,fValueOriginal
,(
lag(fValueAjusted,1,fValueOriginal) OVER (PARTITION BY Cluster ORDER BY iSequence)
+ fValueOriginal
) / 2 as fValueAjusted
FROM cteSequencing
当然 fValueAjusted 在执行时不可用。 LAG() 必须递归地计算一条记录的列,然后提供该列供下一条记录使用。
【问题讨论】:
-
样本数据和预期输出将在这里有所帮助。
-
创建一个附加列(或临时表),插入值,然后将其用于计算。使用提供的有限信息,我能提供的最佳建议。
-
我不能使用临时表,因为计算是递归的。 “函数”的输入是“函数”本身的输出。如果我可以使用函数来做到这一点,它就可以做到,但我不知道怎么做。
-
我将尝试提供一些示例。
标签: sql-server recursion sql-server-2012 lag