sql - 如何根据其他列的值更新列
问题描述
我有一个如下表
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
.但不知道如何包含方差字段来拆分集合。
解决方案
我会建议:
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
. 它应该比答案更有效。
推荐阅读
- javascript - 如何在 React js 中的 CkEditor 5 中设置 maxLength?
- java - 膨胀类 com.google.android.material.navigation.NavigationView 时出错
- java - 在共享偏好中存储变量并在不同活动中更改它们的值
- snowflake-cloud-data-platform - 雪花 to_date() 函数在 FEB 月份无法正常工作
- python - 在 2D 坐标平面中移动,跟踪与原点的位置和距离
- jekyll - 更改 Jekyll 的源目录并保留其他目录
- laravel - composer 为 laravel 带来了空的框架文件夹
- c++ - 如何在特定范围内获取地图的下界?
- javascript - 如何在Bootstrap中为*独立*几个进度条部分设置动画?
- python - Python 管理.Py