微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

应用分区后派生列

如何解决应用分区后派生列

我有如下数据:

+----+--------+------------------+
| Id | Weight | is_weight_faulty |
+----+--------+------------------+
| A  |    100 |                1 |
| A  |     50 |                0 |
| A  |     10 |                0 |
| B  |    500 |                0 |
| B  |    200 |                0 |
| B  |     40 |                0 |
| C  |    100 |                0 |
+----+--------+------------------+

我需要创建一个列正确权重,这取决于两个因素 Id 和值 is_weight_faulty。首先,我将按 Id 应用分区并按 is_weight_faulty 排序。如果对于任何子集,我们在列 1 中找到值 is_weight_faulty,我们的正确权重将是 Weight = Correct_Weight 其中 is_weight_faulty = 1 和该子集的其余条目 {{ 1}} 将是 0。

如果我们查看前三行的 Correct_Weight A Id 在第一行中等于 100,而对于接下来的两行则为 0。对于其余情况,Correct_Weight 等于 {{ 1}},因为对于应用分区依据后我们将获得的每个数据子集,没有 Correct_Weight 的记录。

期望输出

Weight

如果有 is_weight_faulty = 1 条目,我无法创建使 +----+--------+------------------+----------------+ | Id | Weight | is_weight_faulty | Correct_Weight | +----+--------+------------------+----------------+ | A | 100 | 1 | 100 | | A | 50 | 0 | 0 | | A | 10 | 0 | 0 | | B | 500 | 0 | 500 | | B | 200 | 0 | 200 | | B | 40 | 0 | 40 | | C | 100 | 0 | 100 | +----+--------+------------------+----------------+ 为 0 的案例

解决方法

您可以使用 max()over() 窗口函数为每个 is_weight_correct 找出 id 列的最大值。如果是 1,则在 weight 语句的帮助下将 is_weight_correct 乘以 case when else

架构和插入语句:

 create table mytable ( Id varchar(10),Weight int,is_weight_faulty int);
 
 insert into mytable values( 'A',100,1 );
 insert into mytable values( 'A',50,0 );
 insert into mytable values( 'A',10,0 );
 insert into mytable values( 'B',500,200,40,0 );
 insert into mytable values( 'C',0 );

查询:

 select id,weight,is_weight_faulty,(case when max(is_weight_faulty)over(partition by id)=1 then weight*is_weight_faulty else weight end) correct_weight
 from mytable
 GO

输出:

id 权重 is_weight_faulty correct_weight
A 100 1 100
A 50 0 0
A 10 0 0
B 500 0 500
B 200 0 200
B 40 0 40
C 100 0 100

dbhere

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。