2016-07-23 48 views
1
DECLARE @Table1 TABLE 
     (ID int, STATUS varchar(1)) 
    ; 

    INSERT INTO @Table1 
     (ID, STATUS) 
    VALUES 
     (1, 'A'), 
     (1, 'A'), 
     (1, 'A'), 
     (1, 'B'), 
     (1, 'A'), 
     (2, 'C'), 
     (2, 'C') 
    ; 

腳本:怎麼辦分區上VARCHAR列

Select *,ROW_NUMBER()OVER(PARTITION BY STATUS ORDER BY (SELECT NULL))RN from @Table1 

入門結果集

ID STATUS RN 
1 A  1 
1 A  2 
1 A  3 
1 A  4 
1 B  1 
2 C  1 
2 C  2 

需要輸出

ID STATUS RN 
1 A  1 
1 A  2 
1 A  3 
1 B  1 
1 A  1 
2 C  1 
2 C  2 
+0

我想這樣的..以上的結果讓我的查詢,其中,輸出我想是我已經發布去年 – mohan111

+0

這看起來你假設表中的行保持它們插入的順序並將按照該順序返回,沒有這樣的保證。除非您明確命令行,例如使用表中的標識列和查詢中的ORDER BY'子句,可以按任意順序返回行。 – HABO

回答

1

試試這個

DECLARE @Table1 TABLE 
     (ID int, STATUS varchar(1)); 

INSERT INTO @Table1 
    (ID, STATUS) 
VALUES 
    (1, 'A'), 
    (1, 'A'), 
    (1, 'A'), 
    (1, 'B'), 
    (1, 'A'), 
    (2, 'C'), 
    (2, 'C'); 

;WITH Tmp 
AS 
( 
    SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowNumber FROM @Table1 
) 


SELECT 
    A.ID , 
    A.STATUS ,  
    ROW_NUMBER() OVER (PARTITION BY A.STATUS, (A.RowNumber - A.RN) ORDER BY (SELECT NULL)) AS RN 
FROM 
(
    Select *, ROW_NUMBER() OVER(PARTITION BY STATUS ORDER BY RowNumber) AS RN from tmp 

) A 
ORDER BY 
    A.RowNumber 

輸出:

ID   STATUS RN 
----------- ------ ------ 
1   A  1 
1   A  2 
1   A  3 
1   B  1 
1   A  1 
2   C  1 
2   C  2 
+0

幹得好,棒極了.... – DineshDB

+0

歡呼隊友@neer – mohan111

0

首先,在您發佈的插入語句中。與1,2和3有什麼不同,如果它基於不同的列,那麼在分區的子條款中的「row_number」中也包含該列。因爲否則它會認爲4中的'A'和1,2,3中的'A'是相同的,因此將它們組合在一起。

INSERT INTO @Table1 
    (ID, STATUS) 
VALUES 
    (1, 'A'), <-- 1 
    (1, 'A'), <-- 2 
    (1, 'A'), <-- 3 
    (1, 'B'), 
    (1, 'A'), <-- 4 
    (2, 'C'), 
    (2, 'C') 
;