我有一个表格,其中包含22列和6-7,000行,格式如下
Seq_num unique_id name ...
------------------------------------
1 1 abc
1 1 cde
2 1 lmn
2 1 opq
3 1 pqr
4 1 stu
1 2 oaq
2 2 zxq
3 2 fgw
3 2 pie
4 2 tie
我正在尝试将每个unique_id的4个连续序列转换为单行 看起来像
unique_id name ... name ... name ... name ...
--------------------------------------------------------------------------
1 abc lmn pqr stu
2 oaq zxq fgw tie
我使用unique_Id和seq_num上的分区以及左连接来实现此目的。
但是,我需要以下列格式从表中获取所有数据
unique_id name ... name ... name ... name ...
---------------------------------------------------------------------------
1 abc lmn pqr stu
1 cde opq pqr stu
2 oaq zxq fgw tie
2 oaq zxq pie tie
即。我需要在另一行(对于给定的unique_id)显示唯一的seq_num,如果缺少任何seq_num, 使用常见的seq_num(来自相同的unique_id)填写空白..
例如。
由于unique_id 2有两个seq_num 3(fgw,pie),unique_id 2将有两行看起来像
2 oaq zxq fgw tie
2 oaq zxq pie tie
这样的事情是可能的,如果 那怎么样?
我正在使用Oracle 9i。
谢谢,
R. Paul
答案 0 :(得分:0)
所以,你需要填补缺失的空白。以下代码不能按预期工作。思考......
以下代码是WIP。这是生成一整套SEQ_NUM,UNIQUE_ID和NAME列的第一步,但我还没有机会测试它。
select seq_num
, unique_id
, case
when name is not null then name
else lag (name, 1)
over ( partition by unique_id, seq_num
order by nvl2(name, 1, 0)
) end as name
from
(
select t.seq_num
, y.unique_id
, y.name
from ( select 1 as seq_num from dual
union all
select 2 as seq_num from dual
union all
select 3 as seq_num from dual
union all
select 4 as seq_num from dual ) t
left outer join
your_table y
on ( t.seq_num = y.seq_num )
)
NB - 我本可以选择使用CONNECT BY技巧来生成数字,但这在9i中有点不稳定(并且也没有记录)。
答案 1 :(得分:0)
不是答案,而是要求澄清。在您的示例中:
1 abc lmn pqr stu
1 cde opq pqr stu
您在第一行中将“abc”与“lmn”配对,在第二行中将“cde”与“opq”配对。以下行集也是有效的“解决方案”:
1 abc opq pqr stu
1 cde lmn pqr stu
第一行中“abc”与“opq”配对,第二行中“cde”与“lmn”配对?
如果是这样,我不确定你怎么知道你有一个有效的答案集,因为数据中似乎没有任何东西可以帮助你区分这两者。