我需要确定表中的权重是否有效.此表有五列:USER_ID、ACTIVATION_ID、ACTIVATION_DT、Weight和Weight_Source.查询输出需要包括名为VALID_WEIGHTY的计算列.每个用户的第一行应将Valid_Weight列标记为1.Valid_Weight列中的1表示权重有效.如果当前权重与VALID_WEIGHTY列中包含1的上次权重之间的变化小于5%,则认为权重有效.如果权重被视为有效,则VALID_WEIGHT列将被标记为1.如果权重被视为无效,则VALID_WEIGHT列将被标记为0.当前行的权重不能根据Valid_Weight列中为0的前一行进行计算,而必须根据Valid Weight列中为1的最新行进行计算.
我一直在try 使用递归CTE,但由于达到max_recursion_row限制,它一直失败.我认为我的代码正在产生无限循环.
我只需要知道判断表中所有行的最有效方法.
结果应该是这样的:
Activity_ID | User_ID | Activity_DT | Weight | Weight_Source | Valid Weight |
---|---|---|---|---|---|
1 | 56 | 2017-04-19 | 163 | clinic | 1 |
2 | 56 | 2017-04-25 | 163.80 | home_scale | 1 |
3 | 56 | 2017-04-27 | 164.46 | home_scale | 1 |
4 | 56 | 2017-05-11 | 85.32 | home_scale | 0 |
5 | 56 | 2017-05-12 | 190.26 | home_scale | 0 |
6 | 56 | 2017-05-20 | 166.45 | home_scale | 1 |
7 | 56 | 2017-05-21 | 191.14 | home_scale | 0 |
8 | 56 | 2017-06-09 | 159.17 | home_scale | 1 |
9 | 56 | 2017-06-10 | 160.94 | home_scale | 1 |
以下是我一直试图引用的递归CTE代码:
WITH RECURSIVE cteValWgt(User_ID, Activity_ID, Activity_DT, Weight, Weight_Source, Valid_Weight)
AS (SELECT comb.User_ID,
comb.Activity_ID,
comb.Activity_DT,
comb.Weight,
comb.Weight_Source,
1 AS Valid_Weight
FROM etl.rdm_weight_validation AS COMB
WHERE comb.ROW# = 1
UNION ALL
SELECT comb.User_ID,
comb.Activity_ID,
comb.Activity_DT,
comb.Weight,
comb.Weight_Source,
CASE WHEN ABS(comb.Weight - vw.Weight)/(vw.Weight) <= 0.05 THEN 1
ELSE 0
END AS Valid_Weight
FROM cteValWgt AS VW
INNER JOIN etl.rdm_weight_validation AS comb
ON vw.User_ID = comb.User_ID
AND
vw.Activity_DT < comb.Activity_DT
AND
vw.Valid_Weight = 1)
SELECT vw.User_ID,
vw.Activity_ID,
vw.Activity_DT,
vw.Weight,
vw.Weight_Source,
vw.Valid_Weight
FROM cteValWgt AS VW
ORDER BY vw.User_ID, vw.Activity_DT