我在oracle 11g数据库上运行sql语句。输出就像下面的一些连接一样。(还有其他列,但重要的列是这些列)
id | document | address ---+----------------+-------------- 1 | identity_card | hudson street 1 | driver_licence | hudson street 1 | passport | hudson street 1 | identity_card | mike street 1 | driver_licence | mike street 1 | passport | mike street 2 | driver_licence | laura street 2 | passport | laura street 3 | passport | amy street 3 | identity_card | bug street 3 | identity_card | apple street 3 | passport | bug street 4 | driver_licence | 16th street 5 | identity_card | 21st street
但是我希望它是这样的:
id | document | address ---+----------------+-------------- 1 | identity_card | hudson street 1 | identity_card | mike street 2 | passport | laura street 3 | identity_card | bug street 3 | identity_card | apple street 4 | driver_licence | 16th street 5 | identity_card | 21st street
正如您所看到的那样,我正在查看每个ID,如果ID具有identity_card作为文档,我接受该行。如果没有identity_card但有护照,我就拿那条线,如果没有identity_card和护照,我就带上driver_licence。
我该怎么办?我想我可以使用" case ...当"但我无法弄清楚如何应用"案例......当"对我而言。
提前感谢!
答案 0 :(得分:3)
一种方法使用dense_rank()
:
select t.*
from (select t.*,
dense_rank() over (partition by id
order by case when document = 'identity_card' then 1
when document = 'passport' then 2
when document = 'drivers_license' then 3
else 4
end) as seqnum
from t
) t
where seqnum = 1;
答案 1 :(得分:1)
在现有查询中,添加:
, rank() over (partition by id order by case document when 'identity_card' then 1
when 'passport' then 2
when ......................
...........................
end) as rnk
然后,在外部查询中,选择所有内容并添加
where rnk = 1