2013-12-09 49 views
2

我被查询卡住了,我不想使用while循环或另一个讨厌的方法来做到这一点。如何使用Row_Number对结果集进行分组

这里的情况:

我有一个查询,得到了一些数据,我需要计算基于其他2列的列。

我的结果如下: 类型|客户|周期|金额|到期| ROW_NUMBER(分区按客户,周期)

所以,我ROW_NUMBER列需要“群”的客户和周期,这里有一个Fiddle更好地理解它

下面是一个例子: My actual results

,你可以看到,只要我知道row_number是什么,就可以正确应用迭代列。 但我需要这样做: How i need my data

有没有办法做到这一点与Row_Number?

或者我应该需要将数据存储在临时表中,循环并更新此ITERATION列?

也许CTE? 任何帮助,将不胜感激。谢谢!

+0

http://sqlfiddle.com/#!3/506c0/10 – Shiva

回答

2

你可以使用DENSE_RANK功能,而不是ROW_NUMBER。

DECLARE @MyTable TABLE 
(
    Customer NVARCHAR(100) NOT NULL, 
    [Cycle] SMALLINT NOT NULL 
); 
INSERT @MyTable VALUES ('C1', 2010); 
INSERT @MyTable VALUES ('C1', 2010); 
INSERT @MyTable VALUES ('C1', 2011); 
INSERT @MyTable VALUES ('C1', 2012); 
INSERT @MyTable VALUES ('C1', 2012); 
INSERT @MyTable VALUES ('C1', 2012); 
INSERT @MyTable VALUES ('C2', 2010); 
INSERT @MyTable VALUES ('C2', 2010); 

SELECT t.Customer, t.[Cycle], 
     DENSE_RANK() OVER(PARTITION BY t.Customer ORDER BY t.[Cycle]) AS Rnk 
FROM @MyTable t 
ORDER BY Customer, [Cycle]; 

结果:

Customer Cycle Rnk 
-------- ------ --- 
C1  2010 1 
C1  2010 1 
C1  2011 2 
C1  2012 3 
C1  2012 3 
C1  2012 3 
C2  2010 1 
C2  2010 1 

SQL Fiddle

+1

你能告诉我如何在我发布的小提琴上做到这一点吗?我尝试了很多组合,但它总是在每一行返回1。 Select *,Dense_Rank()Over(按客户划分,按周期划分周期) From Test –

+0

@SamCcp:[SQL小提琴](http://www.sqlfiddle.com/#!3/d41d8/26497) –

+1

Oh i得到它,我试图按客户和周期进行分区,诀窍是仅通过客户进行分区......为什么是这样?我的意思是,我的小组是基于这两列的,这个分区是不是也应该这样做? –

4

只是运行此作为新的查询,替换您在您的查询需要什么?

WITH T(StyleID, ID) 
    AS (SELECT 1,1 UNION ALL 
     SELECT 1,1 UNION ALL 
     SELECT 1,1 UNION ALL 
     SELECT 1,2) 
SELECT *, 
     RANK() OVER(PARTITION BY StyleID ORDER BY ID)  AS 'RANK', 
     ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER', 
     DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK' 
FROM T 

问候,
瓦伦丁

+0

感谢队友,你的答案是当场上,但先生波格丹只用了几秒就打败了你。非常感谢你的帮助。 –