应用分区后派生列

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 函数找出每个 idis_weight_correct 列的最大值。如果它是 1,则在 case when else 语句的帮助下将 weightis_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