2016-07-23 1 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 B  1 
1 A  1 
2 C  1 
2 C  2 
출력을 필요

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

설정하기

+0

난 결과 위에 내 쿼리에 대한지고 .. 그런 식으로 원하는 출력 내가 마지막으로 게시 한 내가 원하는 것은 – mohan111

+0

그것을 테이블의 행이 삽입 된 순서대로 유지되고 그 순서대로 반환 될 것이라고 가정하는 것처럼 보입니다. 그러한 보장은 없습니다. 명시 적으로 행을 정렬하지 않으면 (예 : 테이블에 ID 컬럼이 있고 질의에'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

첫째, 게시 한 insert 문에서. 1,2와 3과 다른 4는 다른 컬럼을 기반으로하고 그 컬럼을 하위 절에 의한 파티션의 "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') 
; 
관련 문제