Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何基于其他列的值更新列_Sql_Aggregate_Greenplum - Fatal编程技术网

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更新了解决方案,感谢您的大力支持。这正是我一直在寻找的。是的,这将是我实现目标的途径之一。干杯: