Sql server 按每个ID的最大日期排序,然后按相同ID排序其他记录,然后按其他ID的最大日期排序其他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,
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
请参阅。结果: