我们需要使用两个窗口聚集以达到您想要的结果 - 第一确保为同一ID
的所有行分配一个值,然后在排序标准中使用:
declare @t table (Desired int,ID varchar(9),Dt datetime)
insert into @t(Desired,ID,Dt) values
(1,'foo','20170101'),
(2,'bar','20170202'),
(3,'baz','20170303'),
(3,'baz','20170404'),
(3,'baz','20170505'),
(4,'quz','20170606'),
(4,'quz','20170707')
;With MinDt as (
select *,MIN(Dt) OVER (PARTITION BY ID) as MinDt
from @t
)
select *,DENSE_RANK() OVER (ORDER BY MinDt,ID) as rk
from MinDt
个
结果:
Desired ID Dt MinDt rk
----------- --------- ----------------------- ----------------------- --------------------
1 foo 2017-01-01 00:00:00.000 2017-01-01 00:00:00.000 1
2 bar 2017-02-02 00:00:00.000 2017-02-02 00:00:00.000 2
3 baz 2017-03-03 00:00:00.000 2017-03-03 00:00:00.000 3
3 baz 2017-04-04 00:00:00.000 2017-03-03 00:00:00.000 3
3 baz 2017-05-05 00:00:00.000 2017-03-03 00:00:00.000 3
4 quz 2017-06-06 00:00:00.000 2017-06-06 00:00:00.000 4
4 quz 2017-07-07 00:00:00.000 2017-06-06 00:00:00.000 4
的ID
在DENSE_RANK
列入是作为在壳体的多个仲裁器ID
值具有相同的最小Dt
值。
三个'baz'行有不同的'DateTime'值,但需要全部分配'3'。 'DENSE_RANK'本身并不能解决这个问题。 –
我已经接受你的答案,因为a)它的工作原理(如你的例子所示,我不使用'PARTITION BY')和b)它只需要一个'SELECT'(原始的) –