を - 最初に同じID
のすべての行に1つの値が割り当てられるようにします。
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
DENSE_RANK
におけるID
の包含はID
値が同じ最小Dt
値を有する場合、複数のにタイブレーカとして機能することです。
3つの 'baz'行は異なる' DateTime'値を持っていますが、すべてに '3'を割り当てる必要があります。 'DENSE_RANK'だけではこれを解決できません。 –
私はあなたの答えを受け入れました。(あなたの例に示すように 'PARTITION BY'を使用していない場合)、b)SELECT(元のもの)が1つだけ必要な場合 –