ROW_NUMBER()将Null设置为Min

时间:2015-08-13 21:41:21

标签: sql sql-server oracle

所以我有这个基本设置:

Declare @temp Table(t1 varchar(1)
                    ,t2 int)

insert into @temp (t1,t2)
Values 
('a','1')
,('a','2')
,('a','3')
,('a','4')
,('a',null)


select t1,t2,ROW_NUMBER() OVER ( PARTITION BY T1 ORDER BY t2) 'rnk'
from @temp

问题是,Null的值排名最高。我想要做的是将第一个非零/空值设置为最高等级(最低数字)当前输出:

t1  t2     rnk
a   NULL    1
a   0       2
a   1       3
a   2       4
a   3       5

我想要

t1  t2   rnk
a   NULL 4/5 --either or
a   0    4/5
a   1    1
a   2    2
a   3    3

我知道我可以用subquerys做到这一点,但问题是得到t2,是一个200字符的案例陈述,我真的不想复制和粘贴所有,一次计算,然后一个按顺序等等。我看到一个查询来获取查询中的值,在查询中获取排名,只查询排名为1的那个,这是3深,我不知道这样。 注意我知道它说oracle并且我确信至少有一个人会标记我,因为这是在SQL服务器中,但是,实际代码是在oracle中,我在SQL服务器中更好,并且它易于翻译除非Oracle有一些神奇的功能,这使得这更容易。

1 个答案:

答案 0 :(得分:5)

您可以为order by使用两个键。以下内容与SQL Server和Oracle兼容:

select t1, t2,
      ROW_NUMBER() OVER (PARTITION BY T1
                         ORDER BY (CASE WHEN t2 IS NOT NULL OR T2 <> 0 THEN 0 ELSE 1 END),
                                  t2
                        ) as rnk
from @temp;

Oracle支持NULLS LAST,这样可以更轻松:ORDER BY t2 NULLS LAST