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 :

Incrémentation d'un numéro auto selon deux critères


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    statisticien
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : statisticien
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Incrémentation d'un numéro auto selon deux critères
    Bonjour

    Je bloque depuis quelques jours sur une requête sql dont je ne trouve pas la solution.

    Disons que je ne suis pas très familier au langage sql Oracle.

    Voici mon problème: j'aimerais incrémenter une série "incr" en fonction de deux champs "numéro" et "code" sur le même modèle que ci-dessous:
    En fait, à chaque changement de "numéro" et "code" incr=incr+1 sinon incr=incr

    numéro code entrée le incr
    5003010 A101 15/02/2013 1
    5003010 A120 16/02/2013 2
    5003010 A101 18/02/2013 3
    5003010 A101 19/02/2013 3
    5003010 A101 21/02/2013 3
    5003010 A130 22/02/2013 4
    5003010 A130 24/02/2013 4
    5003010 A020 25/02/2013 5
    5003010 A022 26/02/2013 6



    Cela permettra ensuite d'agréger les données de la manière suivante:
    incr numéro code min(entrée le)
    1 5003010 A101 15/02/2013
    2 5003010 A120 16/02/2013
    3 5003010 A101 18/02/2013
    4 5003010 A130 22/02/2013
    5 5003010 A020 25/02/2013
    6 5003010 A022 26/02/2013


    J'essaye de passer par les fonction row_number over partition by mais en vain...

    Etant nouveau sur le forum, toutes mes excuses d'ores et déjà si toutefois je n'aurais pas respecté une règle...

    Merci par avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,


    Pourquoi ne pas passer simplement par un group by ?

  3. #3
    Candidat au Club
    Homme Profil pro
    statisticien
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : statisticien
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour

    Merci de votre réponse.

    Le group by me donnerait un résultat du genre:

    1 5003010 A101 15/02/2013
    2 5003010 A120 16/02/2013
    4 5003010 A130 22/02/2013
    5 5003010 A020 25/02/2013
    6 5003010 A022 26/02/2013

    et ne tiendrait pas compte de la ligne suivante qui est également à garder:
    3 5003010 A101 18/02/2013

    En fait le group by regrouperait "trop" mes données.
    En effet, le code correspond à une unité médicale, le patient numéro 5003010 peut avoir fait une unité A101 puis A120 puis de nouveau A101.
    Et j'aimerais donc garder la date d'entrée par chaque mutation entre unités, même si le patient revient dans une unité dans laquelle il a déjà été.

    J'espère avoir été clair dans mes explications

    Merci bien

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    hmm, je ne suis pas sur que cette solution couvre tous les cas.

    Essayez avec un jeu de donnée plus grand :

    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
     
    with tmp as (SELECT 5003010 as num, 'A101' as code, to_date('15/02/2013', 'dd/mm/yyyy') as dte from dual union all
    SELECT 5003010, 'A120', to_date('16/02/2013', 'dd/mm/yyyy') from dual union all
    SELECT 5003010, 'A101', to_date('18/02/2013', 'dd/mm/yyyy') from dual union all
    SELECT 5003010, 'A101', to_date('19/02/2013', 'dd/mm/yyyy') from dual union all
    SELECT 5003010, 'A101', to_date('21/02/2013', 'dd/mm/yyyy') from dual union all
    SELECT 5003010, 'A130', to_date('22/02/2013', 'dd/mm/yyyy') from dual union all
    SELECT 5003010, 'A130', to_date('24/02/2013', 'dd/mm/yyyy') from dual union all
    SELECT 5003010, 'A020', to_date('25/02/2013', 'dd/mm/yyyy') from dual union all
    SELECT 5003010, 'A022', to_date('26/02/2013', 'dd/mm/yyyy') from dual),
    tmp2 as (select n.*,
    row_number() over(partition by num order by dte ) - row_number() over(partition by num, code order by dte) as sub1
    from tmp  n)
    select num, code, min(dte)
    from tmp2
    group by num, code, sub1
    order by 3

  5. #5
    Candidat au Club
    Homme Profil pro
    statisticien
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : statisticien
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    votre solution marche parfaitement, un grand merci à vous !

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Voici une alternative :

    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
     
     
    WITH tmp AS (SELECT 5003010 AS num, 'A101' AS code, to_date('15/02/2013', 'dd/mm/yyyy') AS dte FROM dual union ALL
    SELECT 5003010, 'A120', to_date('16/02/2013', 'dd/mm/yyyy') FROM dual union ALL
    SELECT 5003010, 'A101', to_date('18/02/2013', 'dd/mm/yyyy') FROM dual union ALL
    SELECT 5003010, 'A101', to_date('19/02/2013', 'dd/mm/yyyy') FROM dual union ALL
    SELECT 5003010, 'A101', to_date('21/02/2013', 'dd/mm/yyyy') FROM dual union ALL
    SELECT 5003010, 'A130', to_date('22/02/2013', 'dd/mm/yyyy') FROM dual union ALL
    SELECT 5003010, 'A130', to_date('24/02/2013', 'dd/mm/yyyy') FROM dual union ALL
    SELECT 5003010, 'A020', to_date('25/02/2013', 'dd/mm/yyyy') FROM dual union ALL
    SELECT 5003010, 'A022', to_date('26/02/2013', 'dd/mm/yyyy') FROM dual),
    tmp2 AS (
      SELECT n.*,
        LAG(code) OVER(PARTITION BY num ORDER BY dte) AS Prec
      FROM tmp  n)
    SELECT num, code,dte
    FROM tmp2
    WHERE Prec IS NULL OR Prec <> code

  7. #7
    Candidat au Club
    Homme Profil pro
    statisticien
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : statisticien
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour

    Testé, votre alternative fonctionne également, merci de votre contribution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Progress bar + rercherche d'une ligne selon deux critères (sur plusieurs feuilles)
    Par khroutchev dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/07/2013, 12h10
  2. [AC-2007] Fonction de cumul selon deux critères
    Par LouiMz dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/03/2012, 17h37
  3. [AC-2003] Incrémentation d'un numéro auto
    Par Cam78 dans le forum Access
    Réponses: 8
    Dernier message: 25/06/2010, 10h58
  4. [XL-2003] Somme selon deux critères
    Par arnest dans le forum Excel
    Réponses: 1
    Dernier message: 13/01/2010, 09h07
  5. [A-00] Incrémentation d'un numéro auto
    Par aketo1082 dans le forum IHM
    Réponses: 2
    Dernier message: 14/10/2008, 16h42

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