2017-06-21 30 views
0

我試圖得到像下面這樣的結果的行號:SQL Server的增量爲每個新的獨特的價值

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 

帶T-SQL:

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 

提示:看例子A. Ranking rows within a partitiondocumentationenter image description here

+0

三個'baz'行有不同的'DateTime'值,但需要全部分配'3'。 'DENSE_RANK'本身並不能解決這個問題。 –

+0

我已經接受你的答案,因爲a)它的工作原理(如你的例子所示,我不使用'PARTITION BY')和b)它只需要一個'SELECT'(原始的) –

0

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

IDDENSE_RANK列入是作爲在殼體的多個仲裁器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

你確實知道你可以編輯答案,對嗎?你甚至可以在刪除它們的同時編輯它們,然後取消刪除它們。除了目前的這個問題之外,沒有理由爲什麼你應該刪除兩個這個問題的答案。 –

+0

感謝您使用此代碼段,它可能會提供一些即時幫助。通過展示*爲什麼*這是一個很好的解決方案,對未來的讀者會有更好的解決方案,這將爲它的教育價值提供一個合適的解釋[//大大提高](// meta.stackexchange.com/q/114762)但不完全相同的問題。請編輯您的答案以添加解釋,並指出適用的限制和假設。 –