【问题标题】:Fetch relevant rows based on condition using Oracle 12C使用 Oracle 12C 根据条件获取相关行
【发布时间】:2017-02-28 23:48:47
【问题描述】:

我正在尝试查询以下数据集:

示例输入:

create table t(sn varchar(100),easyrfqy varchar(10),ecaty int,ps varchar(10))
insert into t values('abc','NO',0,'E'),('abc','YES',1,'N'),('abc','NO',0,'W'),
('def','NO',1,'E'),('def','NO',0,'X'),('xyz','NO',1,'X')

预期结果:

sn easyrfqy_update ecaty_update ps

abc YES 1 Pref
abc YES 1 Pref
abc YES 1 Pref
def NO  1 Pref
def NO  1 Pref
xyz NO  1 NP

基于逻辑:对于特定的 sn 如果 easyrfqy ='P' or 'E' or 'N' then Pref 对于特定的sn,如果它有一个ecaty 1,则为该sn的所有行设置1 对于特定的 sn,如果它有 easyrfqy 'YES' 然后将所有行设置为 YES

我试过这个:

select * from
(
select *,row_number()over(partition by sn order by ecat desc) as rn from t
)x where x.rn=1

这里是 SQl 小提琴:http://www.sqlfiddle.com/#!6/e104d/1

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • 嘿,戈登,我已经发布了 :) ty
  • easyrfqy 根据样本数据的值为 NO 和 YES。所以(如果 easyrfqy ='P' or 'E' or 'N')比较是不可能的。请澄清。
  • 基于逻辑:对于特定的 sn 如果ps ='P' 或 'E' 或 'N' 然后 Pref 用于特定的 sn 如果它有一个 ecaty 1 然后为所有行设置 1如果它具有easyrfqy 'YES',则特定sn的该sn将所有行设置为YES

标签: sql oracle oracle12c


【解决方案1】:
select t.sn,
       max(easyrfqy) over (partition by sn) as easyrfqy_update,
       max(ecaty) over (partition by sn) as ecaty_update,
       max(case when ps in ('P', 'E', 'N') then 'Pref' else 'NP' end) over (partition by sn) as ps
from t

这取决于在执行查询的实际语言环境中字符串 'YES' 大于 'NO' 的假设,类似地 'Pref' > 'NP'。如果出于任何原因它不是真的,则需要更棘手的方法,例如:

decode(max(case when ps in ('P', 'E', 'N') then 1 else 0 end) over (partition by sn), 1, 'Pref', 0, 'NP') as ps

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2019-06-18
    相关资源
    最近更新 更多