如何根据其他列的值更新列

时间:2019-10-23 07:28:10

标签: 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      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,code,sub_code和item_nbr的每个组合使用min(reporting_date)的min(reporting_date)更新var_start_date列,直到方差字段为零为止。 方差= 0的行应为空var_start_date。并且此后的下一行应具有下一个min(var_start_date。)。仅供参考,方差计算为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 个答案:

答案 0 :(得分:1)

我建议:

IF give_code NOT IN ( SELECT course_code FROM module WHERE course_code = ('WSD' OR 'DDM' OR 'NSF'))THEN 
    SIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = 'Please Check Entered Course And Try Again'; END IF;

请注意,这不使用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; 。它应该比答案更有效。

答案 1 :(得分: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