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

如何在sql中执行以下条件?,sql,oracle11g,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

我已使用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获取输出?

类似这样的操作应该可以实现以下目的:

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
按函数的顺序使用会首先获得rnk=2,然后获得所有其他值。
然后只选择行号为1的记录,这样它就成为col1组中的唯一记录或rnk=2的记录。

最简单的方法是:

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

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

您使用的是什么rdbms?我使用的是oracle 11gmy答案应该与sql server一起使用,我不确定oracle将如何处理它。请测试一下,看看。另外,对于未来的问题,请标记相关的rdbms。我更喜欢这种方法,而不是我自己的答案+1.