如何在VARCHAR列上进行分区

时间:2016-07-23 06:33:27

标签: sql sql-server tsql

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')
    ;

脚本:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

首先,在您发布的插入语句中。 4如何与1,2和3不同,如果它基于不同的列,则在#34; row_number"中包含该列。在子句中的分区。因为否则它会认为' A'在4和' A' 1,2,3是相同的,因此将它们组合在一起。

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