我使用以下条件使用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获取输出?
答案 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
组的记录。