如何根据其他列的值更新某一列?

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

我必须更新var_start_date列,使其成为id、code、sub_code和item_nbr的每个组合的最小reporting_date,仅在variance字段为零时更新。 当variance = 0时,行应具有空的var_start_date。之后的下一行应具有下一个min(var_start_date)。FYI,方差计算为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

但是不知道如何将方差字段包含在数据集分割中。

2个回答

1
我建议:

我建议:

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;

请注意,此方法不使用 JOIN。相比使用 JOIN 的方法,它应该更加高效。

是的,它会,因为我的方法之一就是实现这个功能。干杯 :) - Vignesh Kumar A

0

尝试如下:

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

SQL FIDDLE DEMO

{{链接1:SQL FIDDLE DEMO}}


如果您查看我的示例数据,您会发现对于相同的id、code、sub_code和item_nbr,有两个不同的var_start_date。当我们遇到方差=0的行时,必须使用不同的var_start_date。您的查询将更新所有具有相同var_start_date的记录。 - rach
@rach 更新了解决方案。 - Vignesh Kumar A
非常感谢你,Vignesh。这正是我在寻找的。 - rach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接