SQL:开窗排序,在orderby后加判断条件的作⽤是什么?场景
在⽣产中,经常会看到窗⼝函数中对排序字段加 is not null 判断,类似这样的sql代码:
select
*,
row_number() over(partition by id order by amount_1 is not null desc,amount_2 is not null desc) from  ;
这种⽤法是什么意思呢?
验证
1、⾸先,建⼀张测试表:
create table test.zixuan_test(
a int,
b int,
c int,
d int
)
2、然后往⾥⾯插⼊测试数据:
insert into table test.zixuan_test values
(1,null,3,4),
(1,3,null,4),
(1,3,2,null),
(1,null,2,null),
(1,null,3,4),
(1,1,2,5),
(null,null,null,null),
(2,4,3,4),
(3,0,5,1),
(null,2,3,1);
3、测试order by 后⾯加 is not null 的排序结果:
insert语句字段顺序
select *,row_number() over(partition by a order by b is not null desc,c is not null desc, d is not null desc) from  test.zixuan_test;
4、测试order by 后⾯不加is not null 的排序结果:
select *,row_number() over(partition by a order by b desc,c desc, d desc) from  test.zixuan_test;
主要对⽐a=1的⼏⾏数据,当加了is not null之后,即使写在前⾯的字段值较⼤,但后⾯的值有null,那么这条数据的排名也会靠后。
如:3中的第四⾏记录的b⼤于第三⾏记录,c等于第三⾏记录,但是由于d为null,⽽第三⾏记录的b c d都不为null,则第三⾏的整体排名⽐第四⾏靠前。
猜想:既然可以加is not null判断,那么是否加其他的判断条件,让指定数据的排名靠后呢?
5、测试order by 后⾯加不等于指定值的排序结果:
select *,row_number() over(partition by a order by b <> 3 desc,c is not null desc, d is not null desc) from test.zixuan_test;
如结果中第六⾏和第七⾏所⽰,当在order by b字段时添加b<>3的判断,则b=3的确实排在了b=1的后⾯。
结论
在开窗排序时,可以对指定字段做过滤操作,不符合过滤条件的数据,会被排在后⾯。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。