2013-07-23 2 views
2

J'ai une table qui ressemble à:SQL Server 2012 - Comment mettre à jour une colonne avec des numéros de groupe groupés en fonction de l'autre colonne?

INDEX  IsValid    StopPoint    TripSubId 
----------- ---------------------- ---------------------- ----------- 
7   7      NULL     NULL 
9   9      NULL     NULL 
10   10      NULL     NULL 
13   13      13      NULL 
18   18      NULL     NULL 
25   25      NULL     NULL 
26   26      NULL     NULL 
27   27      NULL     NULL 
28   28      NULL     NULL 
29   29      29      NULL 
30   30      NULL     NULL 
31   31      NULL     NULL 
32   32      NULL     NULL 
33   33      NULL     NULL 
34   34      34      NULL 
35   35      NULL     NULL 
36   36      NULL     NULL 
37   37      NULL     NULL 
39   39      NULL     NULL 
40   40      NULL     NULL 

Et je veux mettre à jour la dernière colonne comme ceci:

INDEX  IsValid    StopPoint    TripSubId 
----------- ---------------------- ---------------------- ----------- 
7   7      NULL     1 
9   9      NULL     1 
10   10      NULL     1 
13   13      13      1 
18   18      NULL     2 
25   25      NULL     2 
26   26      NULL     2 
27   27      NULL     2 
28   28      NULL     2 
29   29      29      2 
30   30      NULL     3 
31   31      NULL     3 
32   32      NULL     3 
33   33      NULL     3 
34   34      34      3 
35   35      NULL     4 
36   36      NULL     4 
37   37      NULL     4 
39   39      NULL     4 
40   40      NULL     4 

Règle est, je veux le nombre d'augmenter une fois que j'atteindre un point n'est pas nul sur la colonne StopPoint.

Comment puis-je le faire?

+0

quelle version de SQL Server ne travaillez-vous? –

Répondre

1
update temp set 
    TripSubId = C.cnt 
from temp as T 
    outer apply (select count(TT.StopPoint) + 1 as cnt from temp as TT where TT.INDEX < T.INDEX) as C 
1

Avez-vous vraiment besoin de stocker la colonne dans la base de données, ou pouvez-vous simplement la calculer lors de la sélection?

SELECT o.INDEX, o.IsValid, o.StopPoint, 
    (SELECT COUNT(*) FROM myTable i where i.INDEX <= o.INDEX AND i.StopPoint IS NOT NULL) as TripSubID 
FROM myTable o 
1
SELECT 
[INDEX] , [IsValid], [StopPoint] 
, [TripSubId] = 
    (SELECT COUNT(*) + 1 
    FROM tbl t2 
    WHERE t2.[INDEX] <= t.[INDEX] AND StopPoint IS NOT NULL) 
FROM tbl t  

SQL Fiddle

0
DECLARE @t table (
    indx  int 
, isvalid int 
, stoppoint int 
, tripsubid int 
); 

INSERT INTO @t (indx, isvalid, stoppoint, tripsubid) 
    VALUES (7, 7, NULL, NULL) 
     , (9, 9, NULL, NULL) 
     , (10, 10, NULL, NULL) 
     , (13, 13, 13 , NULL) 
     , (18, 18, NULL, NULL) 
     , (25, 25, NULL, NULL) 
     , (26, 26, NULL, NULL) 
     , (27, 27, NULL, NULL) 
     , (28, 28, NULL, NULL) 
     , (29, 29, 29 , NULL) 
     , (30, 30, NULL, NULL) 
     , (31, 31, NULL, NULL) 
     , (32, 32, NULL, NULL) 
     , (33, 33, NULL, NULL) 
     , (34, 34, 34 , NULL) 
     , (35, 35, NULL, NULL) 
     , (36, 36, NULL, NULL) 
     , (37, 37, NULL, NULL) 
     , (39, 39, NULL, NULL) 
     , (40, 40, NULL, NULL); 

SELECT t.indx 
    , t.isvalid 
    , t.stoppoint 
    , Dense_Rank() OVER (ORDER BY y.stoppoint) 
FROM @t As t 
CROSS 
APPLY (
     SELECT Coalesce(Max(stoppoint), -1) As stoppoint 
     FROM @t 
     WHERE stoppoint IS NOT NULL 
     AND indx < t.indx 
     ) As y 
ORDER 
    BY t.indx; 
1

Voilà vos données

déclarent la table @tmpTable ( Idx int, int IsValid, StopPoint int, int TripSubID

)

INSERT @tmpTable (Idx,IsValid,StopPoint,TripSubId) 
SELECT 7,7,NULL,NULL union 
SELECT 9,9,NULL,NULL union 
SELECT 10,10,NULL,NULL union 
SELECT 13,13,13,NULL union 
SELECT 18,18,NULL,NULL union 
SELECT 25,25,NULL,NULL union 
SELECT 26,26,NULL,NULL union 
SELECT 27,27,NULL,NULL union 
SELECT 28,28,NULL,NULL union 
SELECT 29,29,29,NULL union 
SELECT 30,30,NULL,NULL union 
SELECT 31,31,NULL,NULL union 
SELECT 32,32,NULL,NULL union 
SELECT 33,33,NULL,NULL union 
SELECT 34,34,34,NULL union 
SELECT 35,35,NULL,NULL union 
SELECT 36,36,NULL,NULL union 
SELECT 37,37,NULL,NULL union 
SELECT 39,39,NULL,NULL union 
SELECT 40,40,NULL,NULL; 

et votre mise à jour

with cte as (
    select StopPoint,ROW_NUMBER() OVER (ORDER BY StopPoint) TripSubID 
    from @tmpTable 
    where StopPoint is not null 
) 

update @tmpTable 
set TripSubID=(select MIN(TripSubID) from cte where a.Idx<=cte.StopPoint) 
from @tmpTable a 
2
WITH T AS 
(
SELECT 
    *, 
    COUNT(StopPoint) OVER (ORDER BY [INDEX] ROWS UNBOUNDED PRECEDING) AS Cnt 
FROM YourTable 
) 
UPDATE T 
SET TripSubId = Cnt + CASE WHEN StopPoint IS NULL THEN 1 ELSE 0 END 

SQL Fiddle

Questions connexes