Sql Oracle按字符串关键字排序或排序
在我们的oracle 12c数据库中,我有一个表地址 模式: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, ....
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语句结合,非常感谢