2017-06-21 16 views
0

私は次のような結果を取得しようとしている:SQL Serverの増分行番号を

このT-SQLで
1 foo 1-Jan 
2 bar 2-Feb 
3 baz 3-Mar 
3 baz 4-Apr 
3 baz 5-May 
4 quz 6-Jun 
4 quz 7-Jul 

SELECT ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [DateTime]) AS [SetNum], * 
FROM [ComplicatedQuery] 

しかし、その代わりに私は取得:

1 foo 1-Jan 
1 bar 2-Feb 
1 baz 3-Mar 
2 baz 4-Apr 
3 baz 5-May 
1 quz 6-Jun 
2 quz 7-Jul 

私はそれが[ID]のそれぞれの新しい一意の値の行/設定番号をインクリメントするように変更できますか?

答えて

1

私は、このようにDENSE_RANK()の代わりROW_NUMBER()を使用します。

DENSE_RANK() OVER(ORDER BY [Column_with_foo_bar_baz_coco_jambo_etc]) AS Rnk 

ヒント:documentationから例A. Ranking rows within a partitionを見て:私たちはあなたの望ましい結果を達成するために2件のウィンドウ集計を使用する必要が enter image description here

+0

3つの 'baz'行は異なる' DateTime'値を持っていますが、すべてに '3'を割り当てる必要があります。 'DENSE_RANK'だけではこれを解決できません。 –

+0

私はあなたの答えを受け入れました。(あなたの例に示すように 'PARTITION BY'を使用していない場合)、b)SELECT(元のもの)が1つだけ必要な場合 –

0

を - 最初に同じ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値を有する場合、複数のにタイブレーカとして機能することです。

0
SELECT Distinct Dense_Rank() OVER (ORDER BY ID) AS [SetNum], ID into #temp 
FROM [ComplicatedQuery] 


SELECT t.SetNum AS [SetNum], cq.* 
FROM [ComplicatedQuery] cq join #temp t on cq.ID=t.ID order by t.SetNum 
+1

答えを編集、右?それらが削除されている間にそれらを編集してからそれらを元に戻すこともできます。現在の質問に加えて、この質問に2つの削除された回答が必要な理由はありません。 –

+0

このコードをご覧いただきありがとうございます。すぐに役立つかもしれません。適切な説明は、なぜ*これが問題の良い解決策であるかを示すことによってその教育上の価値を大幅に改善し(// meta.stackexchange.com/q/114762)、将来の同様の、しかし、同一ではない質問。説明を追加するためにあなたの答えを[編集]し、どんな制限と前提が適用されるかを示してください。 –

関連する問題