ROW_NUMBER()将Null设置为Min旁边的任何内容

Hol*_* IV 1 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
Run Code Online (Sandbox Code Playgroud)

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

t1  t2     rnk
a   NULL    1
a   0       2
a   1       3
a   2       4
a   3       5
Run Code Online (Sandbox Code Playgroud)

我想要

t1  t2   rnk
a   NULL 4/5 --either or
a   0    4/5
a   1    1
a   2    2
a   3    3
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*off 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;
Run Code Online (Sandbox Code Playgroud)

Oracle支持NULLS LAST,这使它更容易: ORDER BY t2 NULLS LAST.