应用分区后派生列
Derive column after Applying Partition by
我有如下数据:
+----+--------+------------------+
| 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
排序。如果对于任何子集,我们在 is_weight_faulty
列中找到值 1
,我们的正确权重将是 Weight
= Correct_Weight
,其中 is_weight_faulty = 1
,对于该子集的剩余条目 Correct_Weight
将是 0。
如果我们查看 Id
的前三行,A Correct_Weight
将在第一行中等于 100,而对于接下来的两行,它将等于 0。对于其余情况,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 |
+----+--------+------------------+----------------+
如果有条目 is_weight_faulty = 1
,我无法创建会使 Correct_Weight
为 0 的案例
您可以使用 max()over()
window 函数找出每个 id
的 is_weight_correct
列的最大值。如果它是 1,则在 case when else
语句的帮助下将 weight
与 is_weight_correct
相乘。
架构和插入语句:
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 , 0 );
insert into mytable values( 'B' , 200 , 0 );
insert into mytable values( 'B' , 40 , 0 );
insert into mytable values( 'C' , 100 , 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
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
dbhere
我有如下数据:
+----+--------+------------------+
| 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
排序。如果对于任何子集,我们在 is_weight_faulty
列中找到值 1
,我们的正确权重将是 Weight
= Correct_Weight
,其中 is_weight_faulty = 1
,对于该子集的剩余条目 Correct_Weight
将是 0。
如果我们查看 Id
的前三行,A Correct_Weight
将在第一行中等于 100,而对于接下来的两行,它将等于 0。对于其余情况,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 |
+----+--------+------------------+----------------+
如果有条目 is_weight_faulty = 1
Correct_Weight
为 0 的案例
您可以使用 max()over()
window 函数找出每个 id
的 is_weight_correct
列的最大值。如果它是 1,则在 case when else
语句的帮助下将 weight
与 is_weight_correct
相乘。
架构和插入语句:
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 , 0 );
insert into mytable values( 'B' , 200 , 0 );
insert into mytable values( 'B' , 40 , 0 );
insert into mytable values( 'C' , 100 , 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 | 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 |
db