Sql 如何基于其他列的值更新列
我有一张如下的桌子Sql 如何基于其他列的值更新列,sql,aggregate,greenplum,Sql,Aggregate,Greenplum,我有一张如下的桌子 row_wid id code sub_code item_nbr orc_cnt part_cnt variance reporting_date var_start_date 1 1 ABC PQR 23AB 0 1 1 11-10-2019 NULL 2 1 ABC PQR 23AB 0 1 1 12-10-2019 NULL 3
row_wid id code sub_code item_nbr orc_cnt part_cnt variance reporting_date var_start_date
1 1 ABC PQR 23AB 0 1 1 11-10-2019 NULL
2 1 ABC PQR 23AB 0 1 1 12-10-2019 NULL
3 1 ABC PQR 23AB 1 1 0 13-10-2019 NULL
4 1 ABC PQR 23AB 1 2 1 14-10-2019 NULL
5 1 ABC PQR 23AB 1 3 2 15-10-2019 NULL
我必须为id、代码、子代码和项目编号的每个组合更新var_start_date列和minreporting_date,直到差异字段为零。
方差为0的行的变量开始日期应为空。之后的下一行应该有下一个minvar\u开始日期。。仅供参考,方差计算为par_cnt-orc_cnt
所以我的输出应该是这样的-
row_wid id code sub_code item_nbr orc_cnt part_cnt variance reporting_date var_start_date
1 1 ABC PQR 23AB 0 1 1 11-10-2019 11-10-2019
2 1 ABC PQR 23AB 0 1 1 12-10-2019 11-10-2019
3 1 ABC PQR 23AB 1 1 0 13-10-2019 NULL
4 1 ABC PQR 23AB 1 2 1 14-10-2019 14-10-2019
5 1 ABC PQR 23AB 1 3 2 15-10-2019 14-10-2019
我正在尝试编写一个函数,使用下面的查询将数据划分为多个集合
SELECT DISTINCT MIN(reporting_date)
OVER (partition by id, code,sub_code,item_nbr ORDER BY row_wid ),
RANK() OVER (partition by id, code,sub_code,item_nbr ORDER BY row_wid)
AS rnk,id, code,sub_code,item_nbr,orc_cnt,part_cnt,variance,row_wid
FROM TABLE T1
.但不知道如何包含方差字段来拆分集合。尝试如下操作
SELECT T.*, CASE WHEN T.variance = 0 THEN NULL ELSE MIN(reporting_date) OVER (PARTITION BY T1.RANK ORDER BY T1.RANK) END AS New_var_start_date
FROM mytbl T
LEFT JOIN (
SELECT row_wid, variance, COUNT(CASE variance WHEN 0 THEN 1 END) OVER (ORDER BY row_wid ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) +1 AS [Rank]
FROM mytbl
) T1 ON T.row_wid = T1.row_wid
我建议:
select t.*,
(case when variance <> 0
then min(reporting_date) over (partition by id, code, sub_code, item_nbr, grouping)
end) as new_reporting_date
from (select t.*,
sum(case when variance = 0 then 1 else 0 end) over (partition by id, code, sub_code, item_nbr) as grouping
from t
) t;
请注意,这不使用联接。它应该比答案更有效。如果您查看我的示例数据,对于同一组id、代码、子代码和项目编号,有两个不同的变量开始日期。当我们遇到方差为0的行时,必须使用不同的变量开始日期。您的查询将更新所有具有相同var_开始日期的记录。@rach更新了解决方案,感谢您的大力支持。这正是我一直在寻找的。是的,这将是我实现目标的途径之一。干杯: