我有一张 table :

表1

id      col     val         rec_pos 
1       Test 1  10          1 
1       Test 2  20          2 
1       Test 3  30          3 
1       Test 2  20          4 
1       Empty   0101        5 
1       Invalid 1011        6 
 
2       Test 4  30          2 
2       Test 5  30          3 
2       Test 6  30          4 
2       Test 5  30          5 
2       Empty   11101       6 
2       Invalid 10101       7 
 
 
3       Test 7  30          5 
3       Test 8  30          6 
3       Test 8  30          7 
3       Test 8  30          8 
3       Empty   11110101    9 
3       Invalid 10010101    10 
 
4       Test 9  30          3 
4       Empty   1101        5 
4       Invalid 1011        6 

对于每个唯一的 id,我需要为 col = 'Empty' 获取 val,然后使用 rec_pos,添加一个名为 empty 的新列并添加适当的值。

同样对于无效,对于每个唯一的 id,我需要获取 val for col = 'Invalid' 然后使用 rec_pos,添加一个名为 invalid 的新列并添加适当的值。

例子:

  1. 对于 id = 1,col = 空,val = 0101

    • rec_pos = 1,在空列中添加值 = 0
    • rec_pos = 2,在空列中添加值 = 1
    • rec_pos = 3,在空列中添加值 = 0
    • rec_pos = 4,在空列中添加值 = 1
  2. 对于 id = 4,col = 空,val = 1101

    • rec_pos = 1,在空列中添加值 = 1
    • rec_pos = 2,在空列中添加值 = 1
    • rec_pos = 3,在空列中添加值 = 0
    • rec_pos = 4,在空列中添加值 = 1

输出将是:

id      col     val         rec_pos     empty       invalid 
1       Test 1  10          1           0           1 
1       Test 2  20          2           1           0 
1       Test 3  30          3           0           1 
1       Test 2  20          4           1           1 
1       Empty   0101        5           0           0 
1       Invalid 1011        6           0           0 
 
2       Test 4  30          2           1           0 
2       Test 5  30          3           1           1 
2       Test 6  30          4           0           0 
2       Test 5  30          5           1           1 
2       Empty   11101       6           0           0 
2       Invalid 10101       7           0           0 
 
 
3       Test 7  30          5           0           0 
3       Test 8  30          6           1           1 
3       Test 8  30          7           0           0 
3       Test 8  30          8           1           1 
3       Empty   11110101    9           0           0 
3       Invalid 10010101    10          0           0 
 
4       Test 9  30          3           0           1 
4       Empty   1101        5           0           0 
4       Invalid 1011        6           0           0 

我如何读取这些值,然后将其适本地分配给相同 ID 的相应 rec_pos?

请您参考如下方法:

如果位置由 rec_pos 确定,那么您可以简单地使用 susbtr 结合解析 max:

select t.*,  
       nvl(substr(max(case col when 'Empty' then val end)  
                     over (partition by id), rec_pos, 1), 0) empty, 
       nvl(substr(max(case col when 'Invalid' then val end)  
                     over (partition by id), rec_pos, 1), 0) invalid 
  from  table1 t 

或相关子查询:

select t.*,  
       nvl(substr((select val  
                    from table1 e  
                    where e.id = t.id and col= 'Empty'), rec_pos, 1), 0) empty, 
       nvl(substr((select val  
                    from table1 i  
                    where i.id = t.id and col= 'Invalid'), rec_pos, 1), 0) invalid 
  from  table1 t 

dbfiddle demo

如果 emptyinvald 是您表中的真实列,则使用与上述任何查询的简单合并来更新它们。但是当列是其他人计算的结果时,最好进行查看。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!