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

Requêtes PostgreSQL Discussion :

Regrouper tous les tuples d'une table par 2 colonnes et les modifier sauf le plus récent


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut Regrouper tous les tuples d'une table par 2 colonnes et les modifier sauf le plus récent
    Bonjour,

    Je tombe sur une requête qui est trop complexe pour moi.

    J'ai un 3 table liées de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select ob.node_id, d.table_name, count(*)
     from sym_outgoing_batch ob
     left join sym_data_event de on de.batch_id=ob.batch_id
     left join sym_data d on d.data_id=de.data_id
    where ob.status != 'OK' and d.event_type='R' 
    group by ob.node_id, d.table_name
    La requête ci-dessus compte le nombre de batch (sym_outgoing_batch) de type 'R' dont le status est !='OK', par node_id.

    Je voudrais mette à jours le status de tous les batch sauf le plus récent par node_id et table_name. La table sym_outgoing_batch contient le champs last_update_time pour les trier par date

    Par exemple, s'il y a 10 lignes pour le node_id=0001 et la table='ma_table', alors je voudrais changer leur statut à 'OK' sauf pour la plus récente de ces 10 lignes.

    La requête suivante récupère la date du batch le plus récent pour chaque couple node_id/table_name, mais je ne n'arrive à récupérer son identifiant batch_id.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select ob.node_id, d.table_name, max(ob.last_update_time)
     from sym_outgoing_batch ob
     left join sym_data_event de on de.batch_id=ob.batch_id
     left join sym_data d on d.data_id=de.data_id
      where ob.status!='OK' and d.event_type='R' 
     group by ob.node_id, d.table_name
    Je voudrais arriver à quelque du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    update sym_outgoing_batch ob
        set status='OK'
    from sym_data_event de
    left join sym_data d on d.data_id=de.data_id
    where de.batch_id=ob.batch_id and ob.status!='OK' and d.event_type='R' 
        and ob.batch_id not in (Liste des batch_id les plus récent par node_id/table_name)
    (je ne suis pas certain non plus de ma requête d'update avec jointure ci-dessus, c'était plus pour exprimer ce à quoi je voulais parvenir)

    Merci par avance.

  2. #2
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    Peut être qu'avec du PL/pgSQL se serait plus simple. Mais pareil je sèche...

Discussions similaires

  1. Ajouter tous les champs d' une Table par programmation
    Par aimer_Delphi dans le forum Bases de données
    Réponses: 6
    Dernier message: 10/05/2016, 18h05
  2. Réponses: 8
    Dernier message: 06/08/2015, 16h17
  3. Réponses: 2
    Dernier message: 27/05/2014, 13h12
  4. Réponses: 3
    Dernier message: 14/04/2009, 21h18
  5. Réponses: 7
    Dernier message: 11/07/2007, 13h26

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