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有,否则很容易翻译一些神奇的功能,使这更容易.
您可以使用两个键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.
| 归档时间: |
|
| 查看次数: |
241 次 |
| 最近记录: |