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

Script:wie Partitionierung auf VARCHAR Spalte tun

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

Erste Ergbnisssatzes

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

Need Output

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

i so wollen .. obige Ergebnis wird für meine Anfrage gegeben wird und wo Output, was ich will, ist i zuletzt geschrieben haben – mohan111

+0

Es Es sieht so aus, als ob Sie davon ausgehen, dass die Zeilen in der Tabelle in der Reihenfolge bleiben, in der sie eingefügt wurden und in dieser Reihenfolge zurückgegeben werden. Eine solche Garantie gibt es nicht. Wenn Sie die Zeilen nicht explizit bestellen, z. Mit einer Identitätsspalte in der Tabelle und einer ORDER BY-Klausel in Abfragen können Sie Zeilen in beliebiger Reihenfolge erhalten. – HABO

Antwort

1

Versuchen Sie, diese

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 

Ausgang:

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

Gut gemacht, Super .... – DineshDB

+0

Prost Mate @neer – mohan111

0

Erstens, in der von Ihnen geposteten insert-Anweisung. Wie unterscheidet sich 4 von 1,2 und 3, wenn es auf einer anderen Spalte basiert, dann fügen Sie diese Spalte auch in "row_number" in partition by sub ein. Denn sonst wird es denken, dass "A" in 4 und "A" in 1,2,3 dasselbe sind und gruppieren sie deshalb zusammen.

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