我的数据每个ID有多行。我想首先按最大日期排序,但将具有相同ID的其他行按日期降序排列在一起,然后将具有下一个最大日期的下一组ID依此类推。
例如,此数据
create table #tbl (id int, dt date);
insert into #tbl (id, dt)
values (1, '2020-07-01')
, (1, '2020-07-17')
, (1, '2020-07-31')
, (2, '2020-07-07')
, (2, '2020-07-14')
, (2, '2020-07-16')
, (3, '2020-07-02')
, (3, '2020-07-20')
;
将输出为
id dt
1 7/31/2020
1 7/17/2020
1 7/1/2020
3 7/20/2020
3 7/2/2020
2 7/16/2020
2 7/14/2020
2 7/7/2020
因此id 1具有最大的日期,然后其他id 1按日期降序排列。接下来,id 3在其余行中具有最大的日期,然后其他id 3行按日期降序,依此类推。
我可以获得最大的日期和行号,但它按日期和ID排序,并且不会将ID分组在一起。
版本:Microsoft SQL Azure (RTM) - 12.0.2000.8 Jul 31 2020 08:26:29 Copyright (C) 2019 Microsoft Corporation
答案 0 :(得分:0)
也许不是最有效的,但这似乎可以为您提供所需的输出:
declare @tempTbl table (id int, dataorder int)
insert into @tempTbl
select
id,
ROW_NUMBER() over (order by max(dt) desc)
from
#tbl
group by id
order by max(dt) desc
select
tbl2.id,
tbl2.dt
from
@tempTbl tbl1 left join #tbl tbl2 on tbl1.id = tbl2.id
order by
tbl1.dataorder,
tbl2.dt desc
答案 1 :(得分:0)
在ORDER BY子句中使用MAX()窗口函数:
select *
from #tbl
order by max(dt) over (partition by id) desc,
id, -- just in case 2 ids have the same max dt
dt desc
请参见demo。
结果:
> id | dt
> -: | :---------
> 1 | 2020-07-31
> 1 | 2020-07-17
> 1 | 2020-07-01
> 3 | 2020-07-20
> 3 | 2020-07-02
> 2 | 2020-07-16
> 2 | 2020-07-14
> 2 | 2020-07-07