Order by statement - 按多列排序
Order by statement - ordering by multiple columns
我有 table 这样的:
A B C
-----------------------
111 3
777
333 1
555 2
333
777 4
888 5
所以,我按语句“按 B 排序”进行排序,结果如下:
A B C
----------------------
333 1
555 2
111 3
777 4
888 5
777
333
但是,我该怎么做才能得到这个排序:
A B C
-----------------------
333 1
333
555 2
111 3
777 4
777
888 5
如果 C 列不为空,我应该将此行放在 A = C 的行后
谢谢!
所以,在这种情况下:
with a(a,b,c) as (select 111,4, null from dual union all
select null,null,777 from dual union all
select 333,1,null from dual union all
select 555,2, null from dual union all
select null,null, 333 from dual union all
select 777, 4, null from dual union all
select 444,null, 333 from dual union all
select 888, 5, null from dual union all
select null,null,777 from dual )
select a.*
from a
order by last_value(b ignore nulls)
over (partition by CASE when b is null then c else a end order by b), b nulls last
我有那个输出(C 777 在 A 111 之后,因为 B 值相同 = 4):
A B C
--------------------
333 1
444 333
333
555 2
777 4
111 4
777
777
888 5
但我想得到这个:
A B C
--------------------
333 1
444 333
333
555 2
777 4
777
777
111 4
888 5
这样做:
select case when C in not null then C else A end as A,B,C from table
就是这样:
Declare @c nchar(50)
Declare @a nchar(50)
set @c = 'record'
set @a = 'sample'
select case when @c is not null then @c else @a end as A,@c as C
可能对你有帮助:
with a(a,b,c) as (select 111,3, null from dual union all
select null,null,777 from dual union all
select 333,1,null from dual union all
select 555,2, null from dual union all
select null,null, 333 from dual union all
select 777, 4, null from dual union all
select 888, 5, null from dual )
select a.*
from a
order by last_value(b ignore nulls) over (partition by nvl(a,c) order by b), b nulls last
输出
333 1
333
555 2
111 3
777 4
777
888 5
选择了 7 行
或者如您稍后所说,您可以同时拥有非空 A 和 C 列,您可以这样做:
with a(a,b,c) as (select 111,3, null from dual union all
select null,null,777 from dual union all
select 333,1,null from dual union all
select 555,2, null from dual union all
select null,null, 333 from dual union all
select 777, 4, null from dual union all
select 444,null, 333 from dual union all
select 888, 5, null from dual )
select a.*
from a
order by last_value(b ignore nulls)
over (partition by CASE when b is null then c else a end order by b), b nulls last
输出
A B C
333 1
333
444 333
555 2
111 3
777 4
777
888 5
8 rows selected
我有 table 这样的:
A B C
-----------------------
111 3
777
333 1
555 2
333
777 4
888 5
所以,我按语句“按 B 排序”进行排序,结果如下:
A B C
----------------------
333 1
555 2
111 3
777 4
888 5
777
333
但是,我该怎么做才能得到这个排序:
A B C
-----------------------
333 1
333
555 2
111 3
777 4
777
888 5
如果 C 列不为空,我应该将此行放在 A = C 的行后
谢谢!
所以,在这种情况下:
with a(a,b,c) as (select 111,4, null from dual union all
select null,null,777 from dual union all
select 333,1,null from dual union all
select 555,2, null from dual union all
select null,null, 333 from dual union all
select 777, 4, null from dual union all
select 444,null, 333 from dual union all
select 888, 5, null from dual union all
select null,null,777 from dual )
select a.*
from a
order by last_value(b ignore nulls)
over (partition by CASE when b is null then c else a end order by b), b nulls last
我有那个输出(C 777 在 A 111 之后,因为 B 值相同 = 4):
A B C
--------------------
333 1
444 333
333
555 2
777 4
111 4
777
777
888 5
但我想得到这个:
A B C
--------------------
333 1
444 333
333
555 2
777 4
777
777
111 4
888 5
这样做:
select case when C in not null then C else A end as A,B,C from table
就是这样:
Declare @c nchar(50)
Declare @a nchar(50)
set @c = 'record'
set @a = 'sample'
select case when @c is not null then @c else @a end as A,@c as C
可能对你有帮助:
with a(a,b,c) as (select 111,3, null from dual union all
select null,null,777 from dual union all
select 333,1,null from dual union all
select 555,2, null from dual union all
select null,null, 333 from dual union all
select 777, 4, null from dual union all
select 888, 5, null from dual )
select a.*
from a
order by last_value(b ignore nulls) over (partition by nvl(a,c) order by b), b nulls last
输出
333 1
333
555 2
111 3
777 4
777
888 5
选择了 7 行
或者如您稍后所说,您可以同时拥有非空 A 和 C 列,您可以这样做:
with a(a,b,c) as (select 111,3, null from dual union all
select null,null,777 from dual union all
select 333,1,null from dual union all
select 555,2, null from dual union all
select null,null, 333 from dual union all
select 777, 4, null from dual union all
select 444,null, 333 from dual union all
select 888, 5, null from dual )
select a.*
from a
order by last_value(b ignore nulls)
over (partition by CASE when b is null then c else a end order by b), b nulls last
输出
A B C
333 1
333
444 333
555 2
111 3
777 4
777
888 5
8 rows selected