2013-12-09 47 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

感謝隊友,你的答案是當場上,但先生波格丹只用了幾秒就打敗了你。非常感謝你的幫助。 –