none
T-SQL Mettre à jour une ligne avec une info de la ligne précédente sans curseur RRS feed

  • Question

  • mon problème me semble simplemais je ne trouve pas, peut être que vous pouvez me donner un coup de pouce.

    j'ai une table d'incident que je joins en left join à une table calendrier.

    ce qui me donne le résultat suivant :

    date  tranche horaire Statut 
    20/09/2013 11 0
    20/09/2013 12 NULL
    20/09/2013 13 NULL
    20/09/2013 14 1
    20/09/2013 15 NULL
    20/09/2013 16 NULL
    20/09/2013 17 NULL
    20/09/2013 18 NULL
    20/09/2013 19 0
    20/09/2013 20 NULL
    20/09/2013 21 NULL
    01/10/2013 8 NULL

    ce que j'aimerais faire c'est ça :

    date  tranche horaire Statut 
    20/09/2013 11 0
    20/09/2013 12 0
    20/09/2013 13 0
    20/09/2013 14 1
    20/09/2013 15 1
    20/09/2013 16 1
    20/09/2013 17 1
    20/09/2013 18 1
    20/09/2013 19 0
    20/09/2013 20 0
    20/09/2013 21 0
    01/10/2013 8 0

    j'ai pensé au RowNumber et a une CTE récursive mais j'avoue ne pas trouver.

    si quelqu'un a une idée ?

    Merci d'avance


    Ludovic Bouaziz - MCSD .net

    mardi 17 septembre 2013 10:04

Réponses

  • Bonjour

    Je vous propose le scripte suivante -

    /*justement pour la creation de la structure de teste. */
    create table  #test  (dt Datetime, tranche int , Statut int  null )
    insert into #test values ('20130920', 11,0);
    insert into #test values ('20130920', 12,NULL);
    insert into #test values ('20130920', 13,NULL);
    insert into #test values ('20130920', 14,1);
    insert into #test values ('20130920', 15,NULL);
    insert into #test values ('20130920', 16,NULL);
    insert into #test values ('20130920', 17,NULL);
    insert into #test values ('20130920', 18,NULL);
    insert into #test values ('20130920', 19,0);
    insert into #test values ('20130920', 20,NULL);
    insert into #test values ('20130920', 21,NULL);
    insert into #test values ('20131001', 8,NULL);
    
    
    /*c'est plus simple de créer une structure qui contient un champ identité pour s'assurer que les éléments sont en ordre. */
    select IDENTITY (int,1,1 ) Id,  * into  #tst2 from #test  order by dt, tranche 
    
    /*la requête */
     select  a.dt, a.tranche, isnull (a.Statut, b.Statut )    from #tst2 a left  join ( select * from #tst2 b where Statut is not null) b 
    	on b.Id  = (select max(Id) from #tst2 b where Statut is not null  and b.Id <= a.Id )
    	order by a.Id 
    
    


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 17 septembre 2013 11:18
    Modérateur

Toutes les réponses

  • Bonjour

    Je vous propose le scripte suivante -

    /*justement pour la creation de la structure de teste. */
    create table  #test  (dt Datetime, tranche int , Statut int  null )
    insert into #test values ('20130920', 11,0);
    insert into #test values ('20130920', 12,NULL);
    insert into #test values ('20130920', 13,NULL);
    insert into #test values ('20130920', 14,1);
    insert into #test values ('20130920', 15,NULL);
    insert into #test values ('20130920', 16,NULL);
    insert into #test values ('20130920', 17,NULL);
    insert into #test values ('20130920', 18,NULL);
    insert into #test values ('20130920', 19,0);
    insert into #test values ('20130920', 20,NULL);
    insert into #test values ('20130920', 21,NULL);
    insert into #test values ('20131001', 8,NULL);
    
    
    /*c'est plus simple de créer une structure qui contient un champ identité pour s'assurer que les éléments sont en ordre. */
    select IDENTITY (int,1,1 ) Id,  * into  #tst2 from #test  order by dt, tranche 
    
    /*la requête */
     select  a.dt, a.tranche, isnull (a.Statut, b.Statut )    from #tst2 a left  join ( select * from #tst2 b where Statut is not null) b 
    	on b.Id  = (select max(Id) from #tst2 b where Statut is not null  and b.Id <= a.Id )
    	order by a.Id 
    
    


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 17 septembre 2013 11:18
    Modérateur
  • Merci, j'ai ajouté une date par défaut du coup dans mon script pour palier au fait que la première date peut être nulle.


    Ludovic Bouaziz - MCSD .net

    mercredi 18 septembre 2013 10:43