2016-07-23 64 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') 
;