按每个ID的最大日期排序,然后按相同的ID排序其他记录,然后按其最大日期排序其他ID

时间:2020-08-14 20:04:17

标签: sql-server

我的数据每个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

2 个答案:

答案 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