Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
1982 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  updater n lignes : combler des trous

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

updater n lignes : combler des trous

n°2234081
gpl73
Posté le 25-07-2014 à 15:59:09  profilanswer
 

bonjour,
je sèche sur un update à la "gomme" :)
Voici mon soucis :
Ma table , t1 (id,c1, c2, ,....) et c'est là que c'est mal foutu, j'ai  
t1(id,c1, c2)
    1,v1, x
    2,   ,y  
    3,    z
    4,v2,a    
    5,   ,b
    6,   ,c
    7,   ,x
    8,   ,z
...
   idn,vn,a1
   idn+1,  ,a2
   idn+2,  ,a3
 
...)
j'aimerai pouvoir updater mon champ c1, avec les valeurs V1 pour les id 2,3,4  , puis v2, pour les id 5,6,7,8...  
t1(id,c1, c2)
    1,v1, x
    2,v1,y  
    3,v1,z
    4,v2,a    
    5,v2,b
    6,v2,c
    7,v2,x
    8,v2,z
...
   idn,vn,a1
   idn+1,vn,a2
   idn+2,vn,a3
...)
 
Je séche, j'arrive pas à me dépétrer... sans y perdre trop de temps... :)
Si quelqu'un a une bonne idée... :)
j'ai pensé à des cursors, à excel aussi...
 
D'avance, merci et bon weekend...  
Guillaume


Message édité par gpl73 le 25-07-2014 à 16:21:37

---------------
mieux vaut être un con au chaud, qu'un con gelé lol
mood
Publicité
Posté le 25-07-2014 à 15:59:09  profilanswer
 

n°2234084
ddr555
Posté le 25-07-2014 à 16:16:19  profilanswer
 

déjà y'a contradiction entre ta règle et ton exemple
dans ton exemple, la ligne 4 donne : 4,v2,a
alors que la règle énoncée donne 4,v1,a
 
déjà faut dire la quelle des solutions est bonne
après ça doit pouvoir se faire par requête, mais avec des sous select

n°2234089
gpl73
Posté le 25-07-2014 à 16:24:30  profilanswer
 

oui, désolé, je viens de modifier la régle... c'est vraiement de combler les trous... comme dans l'exemple...
la ligne 4,v2,2  ne doit pas "bouger" , comme toutes les lignes ayant une valeur c1 non vide...
= ligne de référence, pour les lignes dont l'id est superieur...jusqu'à la prochaine ...


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
n°2234090
ddr555
Posté le 25-07-2014 à 16:29:47  profilanswer
 

update t1 set c1 =  
( select c1 from t1 t2  
  where t2.id < t1.id  
  and t2.c1 is not null
  and t2.id = ( select max(t3.id) from t1 t3
                     where t3.id < t1.id and c1 is not null ))
where t1.c1 is null
 
après ça dépend de ta base de donnée. ça sera à réécrire peut être pour s'y adapter.

n°2234091
lasnoufle
La seule et unique!
Posté le 25-07-2014 à 16:30:00  profilanswer
 

SELECT t1.id, (SELECT MAX(t2.c1) FROM table t2 WHERE t2.id<t1.id) AS c1
FROM table t1
WHERE t1.c1 IS NULL;

Un peu moche mais ca devrait te donner toutes les paires (id, c1) a updater - si et seulement si tes valeurs de c1 sont "rangees" dans le meme ordre que tes id bien sur, sinon le coup du MAX(t2.c1) ne donnera pas la bonne valeur.
 
Apres a toi de foutre ca dans un MERGE; la syntaxe depend de ton SGBD.
Genre pour Oracle, un truc dans le genre:

MERGE INTO table t_updated
USING (
  SELECT t1.id, (SELECT MAX(t2.c1) FROM table t2 WHERE t2.id<t1.id) AS c1
  FROM table t1
  WHERE t1.c1 IS NULL) t_valeurs ON (t_updated.id = t_valeurs.id)
WHEN MATCHED THEN UPDATE SET t_updated.c1 = t_valeurs.c1;

Evidemment, pas teste etc.


---------------
C'était vraiment très intéressant.
n°2234092
gpl73
Posté le 25-07-2014 à 16:35:08  profilanswer
 

ok ;)
je vais voir ça...
merci


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
n°2234255
Oliiii
Posté le 28-07-2014 à 12:58:02  profilanswer
 

Essaye ca (SQL Server):

Code :
  1. Declare @PreviousC1 varchar(20)
  2. SET @PreviousC1 = ''
  3.  
  4. UPDATE T1
  5.     SET @PreviousC1 = C1 = CASE WHEN @PreviousC1 != C1 THEN C1 ELSE @PreviousC1 END


 
Ton cluster index doit être sur ID.
Ca scale super bien, 3 sec pour 1 million de rows, et ca ne fait qu'un seul table scan.

n°2234264
gpl73
Posté le 28-07-2014 à 13:25:34  profilanswer
 

merci à tous ...
J'ai pris celui de ddr555 , car c'est celui qui me plaisait le mieux ! Le plus simple à "pomper" :)... Nickel !
Je garde sous le coude les autres propositions quand même pour d'autres cas...
Guillaume


Message édité par gpl73 le 28-07-2014 à 13:42:49

---------------
mieux vaut être un con au chaud, qu'un con gelé lol

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  updater n lignes : combler des trous

 

Sujets relatifs
Excel: Problème pour étendre une sélectionaide pour formule excel
Manipulation tableaux excel par vbaL'indice n'appartient pas à la sélection, VBA Excel
Demande de réunion VBA Excel/OutlookRécuperer des lignes dans un ordre précis avec une seule requête
[RESOLU ]Changer de colonne suivant condition avec EQUIV EXCELvba pour excel 2003
[RESOLU]Remplir un tableau avec 2 autres tableaux EXCELextraction contenu fichiers txt sur un fichier Excel
Plus de sujets relatifs à : updater n lignes : combler des trous


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR