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 :

Récupération d'une ligne spécifique d'un résultat


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Récupération d'une ligne spécifique d'un résultat
    Bonjour,
    Le titre n'est pas très clair, je m'explique :
    J'ai une table d'historique dans laquelle j'enregistre la progression d'un produit dans la production. Voici un petit schéma :

    ID __ ETAT __ DATE_ETAT
    ----------------------------------
    5 __ 4 __ 24/10/2010
    5 __ 19 __ 25/10/2010
    5 __ 13 __ 26/10/2010
    5 __ 84 __ 27/10/2010
    5 __ 9 __ 28/10/2010
    Pour l'exemple, le produit "5" avance dans la production jour après jour. Lorsque l'état est à "19", suivant la qualité, le produit peut passer à l'état 86, 12, 71 ou 13. Je souhaiterais faire une requête pour récupérer cet état (l'état juste après 19).

    Pour info, il peut y avoir 1 ou plusieurs états avant l'état 19, impossible à prédire. Le seul moyen de connaître l'état suivant est d'utiliser la DATE_ETAT.

    Merci pour votre aide,
    Vincent

  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
    Vous pouvez utiliser la fonction LEAD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    with matable as 
    (
    select 5 as eid,  4 as ecd, to_date('24/10/2010', 'dd/mm/yyyy') as edt from dual union all
    select 5       , 19       , to_date('25/10/2010', 'dd/mm/yyyy')        from dual union all
    select 5       , 13       , to_date('26/10/2010', 'dd/mm/yyyy')        from dual union all
    select 5       , 84       , to_date('27/10/2010', 'dd/mm/yyyy')        from dual union all
    select 5       ,  9       , to_date('28/10/2010', 'dd/mm/yyyy')        from dual
    )
      select eid, edt, ecd,
             lead(ecd) over(partition by eid order by edt asc) as ecd_next
        from matable
    order by eid asc, edt asc;
     
           EID EDT             ECD   ECD_NEXT
    ---------- -------- ---------- ----------
             5 24/10/10          4         19
             5 25/10/10         19         13
             5 26/10/10         13         84
             5 27/10/10         84          9
             5 28/10/10          9

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup pour votre aide, je vais tester ceci dans la journee !

  4. #4
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    En complétant le code fourni par WALDAR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    /* Formatted on 29/10/2010 15:07:51 (QP5 v5.163.1008.3004) */
    WITH matable
         AS (SELECT 5 AS eid, 4 AS ecd, TO_DATE ('24/10/2010', 'dd/mm/yyyy') AS edt FROM DUAL
             UNION ALL
             SELECT 5, 19, TO_DATE ('25/10/2010', 'dd/mm/yyyy') FROM DUAL
             UNION ALL
             SELECT 5, 13, TO_DATE ('26/10/2010', 'dd/mm/yyyy') FROM DUAL
             UNION ALL
             SELECT 5, 84, TO_DATE ('27/10/2010', 'dd/mm/yyyy') FROM DUAL
             UNION ALL
             SELECT 5, 9, TO_DATE ('28/10/2010', 'dd/mm/yyyy') FROM DUAL
             UNION ALL
             SELECT 6, 19, SYSDATE - 1 FROM DUAL
             UNION ALL
             SELECT 6, 86, SYSDATE FROM DUAL)
    SELECT *
      FROM (SELECT eid,
                   edt,
                   ecd,
                   LEAD (ecd) OVER (PARTITION BY eid ORDER BY edt DESC) AS ecd_prev
              FROM matable
    )
     WHERE ecd_prev = 19
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/03/2007, 19h54
  2. récupération d'une ligne avec un select MAX(champ1)
    Par rdams dans le forum Requêtes
    Réponses: 8
    Dernier message: 03/07/2006, 10h33
  3. Réponses: 13
    Dernier message: 26/06/2006, 12h10
  4. Requete entre 2 table et récupération d'une ligne
    Par lechevin dans le forum Langage SQL
    Réponses: 13
    Dernier message: 12/01/2006, 13h54
  5. [C#] Récupération d'une ligne d'un DataView en c#
    Par jerome456 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 20/01/2005, 09h29

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