2017-06-21 67 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)但不完全相同的问题。请编辑您的答案以添加解释,并指出适用的限制和假设。 –