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ë


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    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
    Expert éminent
    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
    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.

###raw>template_hook.ano_emploi###