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 :

Plus ancienne date/entrée si période contiguë [12c]


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mars 2010
    Messages : 95
    Points : 29
    Points
    29
    Par défaut Plus ancienne date/entrée si période contiguë
    Bonjour tout le monde,

    Me voilà bloqué depuis quelques jours sur la mise en place d'une requête SQL.

    J'exprime mon problème dans un premier temps et ensuite vous montre mon début de "code."

    But: J'aimerais pour une entreprise connaître sa date de faillite qui correspond à la date la plus ancienne d'une série contiguë...

    Bon ok c'est pas clair du tout mais compliqué a expliquer par des mots.

    J'ai une table me listant des entreprises issues de fichiers reçus une fois par jour. Une entreprise peut apparaître plusieurs fois (identifié par son numéro d'entreprise) si elle a été "reçue" dans plusieurs fichiers les jours précédents. Les fichiers portent des id et un fichiers plus récent à un id plus grand.
    Une colonne indique si cette entreprise est en faillite ou pas. Valeur = B correspond à faillite sinon null.

    Maintenant que les bases sont posées, je vous mets un exemple qui sera peut-être plus parlant sur la date que je souhaite remonter.


    • Exemple 1:

    IDEXCERPT (=Id du fichier) CH (=Identifiant entreprise) DATE_JOURNAL DIARYKINDOFENTRY (=Indicateur de faillite)
    Fichier 2019-12-01 EntrepriseToto 2019-12-01 B
    Fichier 2019-11-02 EntrepriseToto 2019-11-02 B
    Fichier 2019-10-03 EntrepriseToto (null) (null)
    Fichier 2019-09-04 EntrepriseToto 2019-09-04 B

    Pour cette exemple 1, on remarque que l'entreprise Toto apparait 4 fois. Qu'elle a été en faillite dans le fichier du 04/09, ensuite pas de faillite dans le fichier du 03/10 et est en faillite depuis le fichier du 02/11.
    => On aimerait ici récupérer la date la plus ancienne de la série contiguë de faillite, à savoir la date du 2019-11-02


    • Exemple 2:

    IDEXCERPT (=Id du fichier) CH (=Identifiant entreprise) DATE_JOURNAL DIARYKINDOFENTRY (=Indicateur de faillite)
    Fichier 2019-12-01 EntrepriseToto (null) (null)
    Fichier 2019-11-02 EntrepriseToto 2019-11-02 B
    Fichier 2019-10-03 EntrepriseToto (null) (null)
    Fichier 2019-09-04 EntrepriseToto 2019-09-04 B

    Pour cette exemple 2, la dernière information provenue du fichier le plus récent nous indique "pas de faillite" donc on doit récupérer la valeur null

    • Exemple 3:

    IDEXCERPT (=Id du fichier) CH (=Identifiant entreprise) DATE_JOURNAL DIARYKINDOFENTRY (=Indicateur de faillite)
    Fichier 2019-12-01 EntrepriseToto 2019-12-01 B
    Fichier 2019-11-02 EntrepriseToto 2019-11-02 B
    Fichier 2019-10-03 EntrepriseToto 2019-10-03 B
    Fichier 2019-09-04 EntrepriseToto 2019-09-04 B

    Pour cette exemple 3, nous devons récupérer la date la plus ancienne de la série et comme elle a toujours été en faillite, nous devons récupérer 2019-09-04




    Début de solution ?

    J'ai tenter de créer quelque chose avec les fonctions LAG ou LEAD basé sur l'indicateur de faillite mais je n'arrive pas à gérer tous les cas....

    J'avais écris quelque chose de la sorte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select  IDEXCERPT, CH, DATE_JOURNAL, DIARYKINDOFENTRY,
     case 
        when DIARYKINDOFENTRY is null 
            then null
        when lag(DIARYKINDOFENTRY,1) over (partition by CH order by IDEXCERPT DESC) = DIARYKINDOFENTRY
            then DATE_JOURNAL 
         else null 
            end LAST_DATE    
    from ee_rc_excerpt_v3
    where  CH = 'EntrepriseToto';
    J'ai donc tenté de mixer une clause CASE WHEN avec la fonction LAG ou LEAD mais sans succès.

    Totalement bloqué depuis...

    Merci pour vos lumières car je ne vois pas du tout comment faire maintenant

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Avec la méthode tabibitosan

    Le WITH c'est pour générer une vue avec tes données

    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
    WITH t AS (
    	SELECT 1 entreprise, '2019-12-01' datefic, 'B' faillite FROM DUAL
    UNION ALL SELECT 1, '2019-11-02', 'B' faillite FROM DUAL
    UNION ALL SELECT 1, '2019-10-03', '' faillite FROM DUAL
    UNION ALL SELECT 1, '2019-09-04', 'B' faillite FROM DUAL
    UNION ALL SELECT 2, '2019-12-01', '' faillite FROM DUAL
    UNION ALL SELECT 2, '2019-11-02', 'B' faillite FROM DUAL
    UNION ALL SELECT 2, '2019-10-03', '' faillite FROM DUAL
    UNION ALL SELECT 2, '2019-09-04', 'B' faillite FROM DUAL
    UNION ALL SELECT 3, '2019-12-01', 'B' faillite FROM DUAL
    UNION ALL SELECT 3, '2019-11-02', 'B' faillite FROM DUAL
    UNION ALL SELECT 3, '2019-10-03', 'B' faillite FROM DUAL
    UNION ALL SELECT 3, '2019-09-04', 'B' faillite FROM DUAL
    )
    SELECT entreprise, MIN(datefic), MAX(faillite)
    FROM (
    SELECT t.*, row_number() OVER(PARTITION BY entreprise ORDER BY datefic desc)  - row_number() OVER (PARTITION BY entreprise, faillite ORDER BY datefic desc) grp
    FROM t
    )
    WHERE grp = 0
    GROUP BY entreprise
    résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ENTREPRISE	MIN(DATEFIC)	MAX(FAILLITE)
    1	2019-11-02	B
    2	2019-12-01	
    3	2019-09-04	B
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mars 2010
    Messages : 95
    Points : 29
    Points
    29
    Par défaut
    Merci beaucoup pour votre réponse.

    J'avais fais une recherche sur le forum et la méthode tabibitosan était ressorti mais je n'ai pas su l'exploiter.

    Je vais tester cela de suite. Merci encore !

    EDIT: bon ben les résultats obtenus semblent justes. Je passe le sujet en résolu et un grand grand merci à vous pour l'aide apportée.

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

Discussions similaires

  1. [SQL] Obtenir la date la plus ancienne
    Par yakup.67 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 25/04/2018, 07h06
  2. Rechercher la date la plus ancienne
    Par Syrya dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/04/2008, 16h17
  3. plus ancienne date
    Par jadey dans le forum SQL
    Réponses: 8
    Dernier message: 13/08/2007, 18h23
  4. Sélectionner Date la plus ancienne
    Par guigui11 dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 07/06/2007, 16h28
  5. [XI]Date la plus ancienne
    Par fan_de_crystal dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 04/05/2007, 16h14

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