IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Update avec la valeur de la colonne précédente


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur PLSQL / SQL SERVER
    Inscrit en
    Décembre 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur PLSQL / SQL SERVER

    Informations forums :
    Inscription : Décembre 2010
    Messages : 138
    Points : 78
    Points
    78
    Par défaut Update avec la valeur de la colonne précédente
    Bonjour tout le monde,

    Je veux mettre à jour ma table_1 et voici le scénario :

    Je travaille période par période (de la plus récente à la plus vieille) pour ceux qui ont au moins une catégorie (cat) vide.
    Je prend la cat renseignée la plus récente sur la période.
    Sinon sur celles d'avant
    Sinon sur celles d'après.
    Je propage sur le futur de la période
    Si vide (ne devrait pas arriver).
    Je remonte en arrière sur la période.
    Si vide on met à jour.
    Si j'ai une valeur différente, c'est celle-là que je propagera au retour en arrière.
    Une fois que la période est terminée, je passe à la période précédente.



    Les cat a mettre a jour (avec cette requête je cherche mes t1.id qui ont au moins 1 cat not null) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t1.date_a, t1.date_fin, t1.cat, t1.id 
    FROM table_1 t1 
    WHERE t1.cat is null 
        and exists (SELECT 'x' FROM table_1 t2 WHERE t2.id = t1.id AND t2.cat is not null)
    Résultat :

    date_a date_fin cat id
    15/10/2011 1020930
    05/01/2015 1013145
    ... ... ... ...


    Je prend par exemple le t1.id = 1020930

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ----*** 02 	les périodes, de la plus récente à la plus vieille
    SELECT t2.periode, t1.date_a, t1.date_fin, t1.cat, t1.id 
    FROM table_1 t1 
       INNER JOIN table_2 t2 ON t2.id = t1.idt1
    WHERE t1.id = 1020930
    ORDER BY t2.date_debut desc, t1.date_a desc
    Résultat :

    periode date_a date_fin cat id
    2012A 19/09/2013 6891 1020930
    2012A 12/07/2012 18/09/2013 1020930
    2011A 14/07/2011 1020930
    2011A 03/03/2011 13/07/2011 1020930
    2010A 21/07/2011 6891 1020930
    2010A 01/01/2009 20/07/2011 1020930


    Merci d'avance
    Good luck and never give up

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il manque encore la représentation de ce que vous voulez obtenir.
    Avec les fonction LEAD, LAG, FIRST_VALUE ou LAST_VALUE vous devriez vous en sortir.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur PLSQL / SQL SERVER
    Inscrit en
    Décembre 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur PLSQL / SQL SERVER

    Informations forums :
    Inscription : Décembre 2010
    Messages : 138
    Points : 78
    Points
    78
    Par défaut
    Merci Waldar,

    Dans mon exemple précédent je veux avoir ça comme résultat

    periode date_a date_fin cat id
    2012A 19/09/2013 6891 1020930
    2012A 12/07/2012 18/09/2013 6891 1020930
    2011A 14/07/2011 6891 1020930
    2011A 03/03/2011 13/07/2011 6891 1020930
    2010A 21/07/2011 6891 1020930
    2010A 01/01/2009 20/07/2011 6891 1020930



    sinon voici un autre exemple :

    periode date_a date_fin cat id
    2005A 03/02/2011 200547725 143456
    2005A 21/12/2006 02/02/2011 200547725 143456
    2005A 23/11/2006 20/12/2006 254593466 143456
    2005A 17/08/2006 22/11/2006 254593466 143456
    2004A 03/02/2011 200547725 143456
    2004A 23/11/2006 02/02/2011 200547725 143456
    2004A 15/09/2005 22/11/2006 200547725 143456
    2003A 03/02/2011 200547725 143456
    2003A 23/11/2006 02/02/2011 200547725 143456
    2003A 16/12/2004 22/11/2006 200547725 143456
    2003A 17/06/2004 15/12/2004 200547726 143456

    J'ai utilisé LAST_VALUE mais je ne sais pas comment le faire dans le UPDATE.

    Est ce que je passe par un curseur ou des tests pour réalisé ma MAJ?
    Good luck and never give up

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Vous pouvez utiliser MERGE

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur PLSQL / SQL SERVER
    Inscrit en
    Décembre 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur PLSQL / SQL SERVER

    Informations forums :
    Inscription : Décembre 2010
    Messages : 138
    Points : 78
    Points
    78
    Par défaut
    J'ai ça mais je n'arrive pas a faire le update période par période :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ----**** Voici un test avec id = 1020930
    UPDATE table_1 t1
    SET t1.cat = (SELECT Last_Value(t1.cat ignore nulls) over (partition by t1.id order by t2.date_debut desc, t1.date_a desc)
                       FROM table_1 t1 
                               INNER JOIN table_2 t2 ON t2.id = t1.idt1
                       WHERE t1.id = 1020930
    	                   and t1.cat is not null)
    WHERE t1.id = 1020930
        and t1.cat is null;
    ma sous requête me renvoie le LAST id non null par période.
    Good luck and never give up

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur PLSQL / SQL SERVER
    Inscrit en
    Décembre 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur PLSQL / SQL SERVER

    Informations forums :
    Inscription : Décembre 2010
    Messages : 138
    Points : 78
    Points
    78
    Par défaut
    Quelqu'un à une idée ? help
    Good luck and never give up

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur PLSQL / SQL SERVER
    Inscrit en
    Décembre 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur PLSQL / SQL SERVER

    Informations forums :
    Inscription : Décembre 2010
    Messages : 138
    Points : 78
    Points
    78
    Par défaut
    Je viens de reprendre le sujet et j'ai trouvé la solution.

    j'utilise un curseur et puis mon update dans une boucle forall avec un bulk collect

    Merci quand même
    Good luck and never give up

  8. #8
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    5 mois plus tard, pas mal !


    Sinon la fonction LAG aurait dû vous permettre d'y parvenir

Discussions similaires

  1. [SQL] Update avec un count sur une colonne de la meme table
    Par debdev dans le forum SAS Base
    Réponses: 5
    Dernier message: 28/01/2014, 16h46
  2. retrouver une table avec la valeur d'une colonne
    Par naitregitan dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/12/2012, 09h50
  3. Réponses: 0
    Dernier message: 06/02/2008, 17h09
  4. Effectuer un UPDATE avec la valeur d'un Select
    Par KHELOUIATI dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/10/2006, 11h16
  5. UPDATE avec une valeur MAX
    Par Bobtop dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/06/2006, 12h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo