如何解决应用分区后派生列
我有如下数据:
+----+--------+------------------+
| 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 |
db
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。