所以我有这个基本设置:
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有一些神奇的功能,这使得这更容易。
答案 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
。