我有一张 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
的新列并添加适当的值。
例子:
对于 id = 1,col = 空,val = 0101
- rec_pos = 1,在空列中添加值 = 0
- rec_pos = 2,在空列中添加值 = 1
- rec_pos = 3,在空列中添加值 = 0
- rec_pos = 4,在空列中添加值 = 1
对于 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
如果 empty
和 invald
是您表中的真实列,则使用与上述任何查询的简单合并来更新它们。但是当列是其他人计算的结果时,最好进行查看。