【问题标题】:How to update a column based on values of other columns如何根据其他列的值更新列
【发布时间】:2020-02-19 09:24:55
【问题描述】:

我有如下表格

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) 更新 var_start_date 列,直到方差字段为零。 方差 = 0 的行应该有空 var_start_date。之后的下一行应该有下一个分钟(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

。但不知道如何包含方差字段来拆分集合。

【问题讨论】:

    标签: sql aggregate greenplum


    【解决方案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。它应该比答案更有效。

    【讨论】:

    • 是的,因为我的方法是实现的方法之一。干杯:)
    【解决方案2】:

    尝试如下

    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

    【讨论】:

    • 如果您查看我的示例数据,对于同一组 id、code、sub_code 和 item_nbr 有两个不同的 var_start_date。当我们遇到方差=0 的行时,必须使用不同的 var_start_date。您的查询将使用相同的 var_start_date 更新所有记录。
    • @rach 更新了解决方案
    • 非常感谢 Vignesh。这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多