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

Sql server 按每个ID的最大日期排序,然后按相同ID排序其他记录,然后按其他ID的最大日期排序其他ID,sql-server,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,

我有每个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按日期递减。接下来,ID3具有剩余行中的最大日期,然后其他ID3行按日期递减,依此类推

我可以得到最大日期和行号,但它是按日期然后按ID排序的,并且不会将ID分组在一起


版本:
Microsoft SQL Azure(RTM)-12.0.2000.8 Jul 31 2020 08:26:29版权所有(C)2019 Microsoft Corporation

可能不是最有效的,但这似乎可以为您提供所需的输出:

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

也许不是最有效的,但这似乎给了你想要的输出:

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
在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
请参阅。
结果:

在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
请参阅。
结果: