【发布时间】:2022-11-30 04:40:05
【问题描述】:
我知道这里已经被问过并回答过几次,但我似乎找不到我的具体问题的答案。这是递归查询:
CTE as (
SELECT
ZipCode
,Age
,[Population]
,Deaths
,DeathRate
,Death_Proportion
,DeathProbablity
,SurvivalProbablity
,PersonsAlive
FROM ProbabilityTable
WHERE Age = 0
UNION ALL
SELECT
p.ZipCode
,p.Age
,p.[Population]
,p.Deaths
,p.DeathRate
,p.Death_Proportion
,p.DeathProbablity
,p.SurvivalProbablity
,LAG(c.PersonsAlive,1) OVER(PARTITION BY p.ZipCode ORDER BY p.Age) * p.SurvivalProbablity
FROM ProbabilityTable p
INNER JOIN CTE c
ON p.ZipCode = c.ZipCode
and p.Age = c.Age
WHERE p.Age < 86
)
在 ProbabilityTable 中,当 Age = 0 时,PersonsAlive 被设置为 100,000。我想用递归 CTE 做的是将 PersonsAlive 的先前值乘以当前 SurvivalProbability 来计算该年龄的 PersonsAlive。年龄上升到 85 岁,所以这就是为什么我将终止条款设置为 86 岁。
我已经尝试多次调整查询的递归部分(并且还在锚点部分将 PersonsAlive 设置为 100,000)但我无法弄清楚。这是我第一次尝试递归查询,即使完成了一些课程作业,它也不适合我。
【问题讨论】:
-
错误告诉你查询是错误的。 JOIN 条件可以轻松地将行连接到自身,从而导致无限递归。您可能应该将
WHERE p.Age < 86替换为WHERE p.Age !=0 AND p.Age < 86,否则根行可以连接到自身
标签: sql-server common-table-expression recursive-query