问题描述
PortfolioNumber LevelCode AccountNumber Status track
123 2 A101 Failed 1
123 2 A102 Failed 1
123 2 A103 Passed 0
123 1 A101 Passed 0
123 1 A102 Passed 0
123 1 A103 Passed 0
123 3 A101 Failed 1
123 3 A102 Failed 1
123 3 A103 Failed 1
456 1 A406 Failed 1
456 1 A407 Passed 0
456 1 A408 Failed 1
我通过对其他几个表进行某些其他联接来获得此表,
此表数据表示什么- 档案编号(123)在那里,我们总共有三个AccountNumber。 我们有不同的LevelCode(此处为1,2,3),每个级别都标记为PortfolioNumber,并且也将标记相同的3个帐号。 并且我们在每一行都有状态...已经创建了跟踪列jsut,将Failed设置为Failed为1和Passed设置为0,我稍后在下面的查询中尝试使用此列(可以删除此列)
我想找到的东西-
每个状态失败的唯一投资组合号(由该组合的所有三个accountNumber组成)的最低级别代码集
查询-选择PortfolioNumber,LevelCode, min(LevelCode),sum(track)来自 (我通过其他一些表获得的表数据加入..上面粘贴) 按PortfolioNumber,LevelCode分组 sum(track)> 0'
但这并不能给出正确的结果,并且所有列现在都用光了
期望的结果我是什么
PortfolioNumber LevelCode AccountNumber Status track
123 2 A101 Failed 1
123 2 A102 Failed 1
123 2 A103 Passed 0
456 1 A406 Failed 1
456 1 A407 Passed 0
456 1 A408 Failed 1
使用Oracle
解决方法
此查询:
select distinct PortfolioNumber,min(LevelCode) over (partition by PortfolioNumber) LevelCode
from tablename
group by PortfolioNumber,LevelCode
having sum(track) > 0
返回所需的PortfolioNumber / LevelCode组合。
将其与运算符IN
一起使用以获取表的行:
select *
from tablename
where (PortfolioNumber,LevelCode) in (
select distinct PortfolioNumber,min(LevelCode) over (partition by PortfolioNumber) LevelCode
from tablename
group by PortfolioNumber,LevelCode
having sum(track) > 0
)
请参见demo。
结果:
> PORTFOLIONUMBER | LEVELCODE | ACCOUNTNUMBER | STATUS | TRACK
> --------------: | --------: | :------------ | :----- | ----:
> 123 | 2 | A101 | Failed | 1
> 123 | 2 | A102 | Failed | 1
> 123 | 2 | A103 | Passed | 0
> 456 | 1 | A406 | Failed | 1
> 456 | 1 | A407 | Passed | 0
> 456 | 1 | A408 | Failed | 1
,
我想我只会使用相关的子查询:
select t.*
from t
where t.levelcode = (select min(t2.levelcode)
from t t2
where t2.portfolionumber = t.portfolionumber and
t2.status = 'Failed'
);
这似乎是最简单的解决方案,可以使用(portfolionumber,status,levelcode)
上的索引轻松地对其进行优化。
如果您愿意,使用窗口函数的类似方法是:
select t.*
from (select t.*,min(case when status = 'failed' then levelcode end) over (partition by portfolionumber) as min_failed_levelcode
from t
) t
where levelcode = min_failed_levelcode