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 :

Obtenir les dates mini et maxi sur période différente pour la même donnée


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Par défaut Obtenir les dates mini et maxi sur période différente pour la même donnée
    Bonjour à tous,

    Je me casse la tête sur une requête qui me semblait simple au départ, mais que je n'arrive pas à écrire.
    Voici ce que je veux pouvoir faire :
    Nom : Classeur1 - Excel_180501.png
Affichages : 459
Taille : 25,3 Ko

    Tout ce que j'arrive à obtenir c'est bien sûr avec un group by, une ligne pour A, et une ligne pour B, mais dont les max(date) et min(date) ne sont pas associées aux périodes différentes..
    J'ai tenté l'utilisation de over partition, mais pas mieux.

    Est-ce que quelqu'un aurait une piste de recherche autre que la procédure stockée svp ?

    Merci d'avance pour votre aide!

    droog

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 216
    Par défaut
    Je pense que ceci devrait convenir :

    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 Tous_les_debuts as  
    ( select a.qdate , b.qcode 
      from matable t0
      where not exists (select * from matable t1 where t1.qdate = t0.qdate-1 and t1.qcode = t0.qcode)
    )
    ,
    Toutes_les_fins as 
    ( select a.qdate , b.qcode 
      from matable t0
      where not exists (select * from matable t1 where t1.qdate = t0.qdate+1 and t1.qcode = t0.qcode)
    )
    select a.qdate as date_debut, min(b.qdate) as date_fin, a.qcode 
    from tous_les_debuts a, toutes_les_fins b
    where a.qcode = b.qcode 
    and a.qdate <= b.qdate
    group by a.qdate, a.qcode
    Et comme on est sur le forum Oracle, je me permets de ne pas utiliser la syntaxe avec JOIN.

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Question con, mais pourquoi dans l'exemple B commence au 13/01 ?

    Je pense que la méthode tabibitosan fonctionnera https://www.developpez.net/forums/d1...e-tabibitosan/

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    J'y suis arrivé avec les fonctions de fenêtrage LAG et SUM
    Ensuite, ça dépend de ce qu'il faut faire si une date manque (le 05/01/2018 par exemple) : nouveau groupement ou pas ?

    S'il faut un nouveau groupement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH T AS (SELECT dte, CASE WHEN dte BETWEEN TO_DATE('12.01.2018', 'DD.MM.RRRR') AND TO_DATE('21.01.2018', 'DD.MM.RRRR') THEN 'B' ELSE 'A' END carac
    FROM (SELECT TRUNC(SYSDATE, 'RR') -1 + ROWNUM dte FROM dual connect BY LEVEL < 40)
    WHERE dte <> TO_DATE('05.01.2018', 'DD.MM.RRRR')
    )
    SELECT carac, MIN(dte), MAX(dte)
    FROM (
      SELECT dte, carac, SUM(nouv_partition) OVER (ORDER BY dte) grp
      FROM (
      SELECT dte, carac,  CASE WHEN lag(carac || dte, 1) OVER (ORDER BY dte) = carac || (dte -1) THEN 0 ELSE 1 END nouv_partition
      FROM t
      ))
    GROUP BY carac, grp
    ORDER BY grp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CARAC	MIN(DTE)	MAX(DTE)
    A	01/01/2018	04/01/2018
    A	06/01/2018	11/01/2018
    B	12/01/2018	21/01/2018
    A	22/01/2018	08/02/2018
    S'il ne faut pas de nouveau groupement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH T AS (SELECT dte, CASE WHEN dte BETWEEN TO_DATE('12.01.2018', 'DD.MM.RRRR') AND TO_DATE('21.01.2018', 'DD.MM.RRRR') THEN 'B' ELSE 'A' END carac
    FROM (SELECT TRUNC(SYSDATE, 'RR') -1 + ROWNUM dte FROM dual connect BY LEVEL < 40)
    WHERE dte <> TO_DATE('05.01.2018', 'DD.MM.RRRR')
    )
    SELECT carac, MIN(dte), MAX(dte)
    FROM (
      SELECT dte, carac, SUM(nouv_partition) OVER (ORDER BY dte) grp
      FROM (
        SELECT dte, carac,  CASE WHEN lag(carac, 1) OVER (ORDER BY dte) = carac  THEN 0 ELSE 1 END nouv_partition
        FROM t
      ))
    GROUP BY carac, grp
    ORDER BY grp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CARAC	MIN(DTE)	MAX(DTE)
    A	01/01/2018	11/01/2018
    B	12/01/2018	21/01/2018
    A	22/01/2018	08/02/2018

    PS : Bien sûr s'il faut gérer les NULL il faut modifier les requêtes

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Plus simple:
    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
    create table t_data1 (
      event_dat date,
      event_code char(1)
    );
    
    
    WITH r_data AS (
        SELECT  d.*, 
        CASE WHEN LAG(event_code) OVER(ORDER BY event_dat) = event_code 
          THEN 0 ELSE 1 END AS rupt
        FROM       t_data1 d
    ),
    g_data AS (
        SELECT d.*, SUM(rupt) OVER(PARTITION BY event_code ORDER BY event_dat) AS grp
        FROM r_data d
    )
    SELECT event_code, MIN(event_dat) AS debut_code, max(event_dat) as fin_code
    FROM g_data
    GROUP BY event_code, grp
    ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    event_code debut_code fin_code
    A    2018-01-22 00:00:00    2018-02-03 00:00:00
    A    2018-01-01 00:00:00    2018-01-11 00:00:00
    B    2018-01-12 00:00:00    2018-01-21 00:00:00

  6. #6
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Par défaut
    Merci à tous pour vos propositons et réponses !
    Cela fonctionne parfaitement, j'ai pu le mettre en place trés récemment seulement...
    Mon problème avait été mis en standby.

    Merci encore à tous et désolé pour le retour tardif!

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

Discussions similaires

  1. obtenir les enregistrement d'un domaine sur serveurs dns
    Par yamnetouaga dans le forum Réseau
    Réponses: 0
    Dernier message: 11/01/2008, 18h30
  2. Proleme avec les dates dans mes requete sur oracle
    Par Aboubacry dans le forum SQL
    Réponses: 1
    Dernier message: 28/05/2007, 01h46
  3. Réponses: 6
    Dernier message: 11/04/2007, 16h54
  4. [SQL2005] Obtenir les dates calendrier
    Par frechy dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/04/2007, 22h44
  5. Réponses: 4
    Dernier message: 23/01/2006, 10h13

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