Sql Oracle按字符串关键字排序或排序

Sql Oracle按字符串关键字排序或排序,sql,oracle,Sql,Oracle,在我们的oracle 12c数据库中,我有一个表地址 模式: Integer personId as PK String source (what the source data from) String address1 String address2 String post code etc... 行的示例: p1, news paper(Primary), add1, add2, .... p1, google (Primary), add1, add2, ....

在我们的oracle 12c数据库中,我有一个表地址

模式:

Integer personId as PK
String  source (what the source data from) 
String  address1
String  address2 
String  post code 
etc...
行的示例:

p1, news paper(Primary), add1, add2, ....
p1, google    (Primary), add1, add2, ....
p1, phone     (Secondary), add1, add2, ....
p2  new paper (Primary), add1, add2......
p3  phone (Secondary), add1, add2.....
问题: 我需要每个人都有一个唯一的地址。虽然大多数人只有一个地址,但在有些情况下,一个人最终会有两个或更多的地址

当前解决方案:

 select * from (
  select person_id, source,row_number() over(partition by person_id order by source) rn from address
  )a
  where a.rn = 1
查询将按源的字母顺序对重复项排序,并删除1个重复项


但是我不能简单地按字母顺序排列,因为任何来源包含(主)优先于任何其他来源,而且每个人也不能保证只有一个主地址,它可能有两个次地址或两个主地址,但在大多数情况下,它会有一个主要的和一个次要的

继续你开始的方式。到目前为止,您仅按来源排名(即顺序)。你想要另一个排名(即顺序)?然后应用它。例如:

select * 
from
(
  select 
    person_id, 
    source,
    row_number() over(
      partition by person_id
      order by case when source like '%(Primary)%' then 1 else 2 end, source) as rn
  from address
) a
where a.rn = 1;

继续你开始的方式。到目前为止,您仅按来源排名(即顺序)。你想要另一个排名(即顺序)?然后应用它。例如:

select * 
from
(
  select 
    person_id, 
    source,
    row_number() over(
      partition by person_id
      order by case when source like '%(Primary)%' then 1 else 2 end, source) as rn
  from address
) a
where a.rn = 1;

您需要制定一些业务规则并测试它们的有效性。如果不针对外部数据集进行验证,您似乎没有足够的信息来达成某些确定的业务规则。资料来源:我建立的系统就是这样做的。@ben,你是布里斯托尔人吗?不,我不是…@ben,好吧…你需要制定一些业务规则并测试它们的有效性。如果不针对外部数据集进行验证,您似乎没有足够的信息来达成某些确定的业务规则。资料来源:我建立的系统就是这样做的。@ben you总部在布里斯托尔?不,我不…@ben好吧…我知道我很接近,我只是不确定order by是否可以与case语句结合,非常感谢muchI知道我很接近,我只是不确定order by是否可以与case语句结合,非常感谢