如何在sql中执行以下条件?

时间:2016-05-08 07:12:51

标签: sql oracle11g

我使用以下条件使用SQL创建了一个表:

create table tbl2 as 
select a.*, rank () over (partition by col1 order by col2) as rnk 
from tbl1

现在我想从tbl2创建另一个表,我想在以下条件下选择记录:如果记录只有一个等级可用,那么我将选择该记录,但如果记录有多个可用的等级,那么我将选择排名第二。让我举个例子:

col1 rnk
1      1
2      1
2      2
3      1
3      2
3      3

期望的输出:

col1    rnk
1       1
2       2
3       2

如何使用SQL获取输出?

2 个答案:

答案 0 :(得分:1)

天真的做法是:

select *
from tbl2 t
where rnk = 2 or not exists (select 1 from tbl2 where col1 = t.col1 and rnk <> t.rnk)

这不适用于第二等级不是2的情况,但是......

答案 1 :(得分:0)

这样的事情可以解决问题:

SELECT col1, rnk
FROM
(
    SELECT col1, rnk, ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY CASE WHEN rnk = 2 THEN 0 ELSE 1 END) rn
    FROM tbl2
) x 
WHERE rn = 1

case功能的顺序使用row_number先获取rnk = 2,然后获取所有其他功能。
然后只选择row_number为1的记录,因此它是col1组中的唯一记录或rnk = 2组的记录。