我們需要使用兩個窗口聚集以達到您想要的結果 - 第一確保爲同一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'(原始的) –