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

Requêtes PostgreSQL Discussion :

Last first Group by et window


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Profil pro
    Cto
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Cto

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Last first Group by et window
    Bonjour

    Je souhaite faire une requête qui me regroupe mes données et permet de déterminer le début et la fin de chaque groupe de lignes

    les données de base sont les suivantes

    Empl_id pro_id projet d_start d_end
    1814 11 PROJETC 18/09/17 09/10/17
    1814 1457 PROJETB 10/10/17 16/10/17
    1814 1457 PROJETB 17/10/17 29/10/17
    1814 1457 PROJETB 30/10/17 12/11/17
    1814 1457 PROJETB 13/11/17 01/01/18
    1814 1457 PROJETB 02/01/18 05/08/18
    1814 1457 PROJETB 06/08/18 23/12/18
    1814 11 PROJETC 24/12/18 27/12/18
    1814 11 PROJETC 28/12/18 06/01/19
    1814 2482 PROJET_J 07/01/19 14/01/19
    1814 2482 PROJET_J 15/01/19 10/03/19
    1814 2614 PROJET_1 11/03/19 07/07/19

    Je souhaite regrouper par projet et debut de projet les lignes pour trouver le debut et la fin sachant que je peux avoir le même projet (exemple projet_c) qui revient plusieurs fois

    Résultat Attendu
    Empl_id pro_id projet d_start d_end
    1814 11 PROJETC 18/09/17 09/10/17
    1814 1457 PROJETB 10/10/17 23/12/18
    1814 11 PROJETC 24/12/18 06/01/19
    1814 2482 PROJET_J 07/01/19 10/03/19
    1814 2614 PROJET_1 11/03/19 07/07/19



    Resulat obtenu
    Empl_id pro_id projet d_start d_end
    1814 11 PROJETC 18/09/17 06/01/19
    1814 1457 PROJETB 10/10/17 23/12/18
    1814 2482 PROJET_J 07/01/19 10/03/19
    1814 2614 PROJET_1 11/03/19 07/07/19

    Auriez-vous une idée j'ai essayé avec les group by les partition etc... mais impossible d'avoir 2 lignes pour le même projet

    Merci d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    bonjour,

    Est-ce que ce post ne répondrait pas à votre demande ?
    https://www.developpez.net/forums/d1...rvalles-dates/
    Le savoir est une nourriture qui exige des efforts.

  3. #3
    Futur Membre du Club
    Profil pro
    Cto
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Cto

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci,

    Je viens de regarder cela ne correspond pas à ce que je cherche à faire

  4. #4
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    re,

    En quoi la demande :
    Je cherche à connaître la date de début et celle de fin en continuité entre plusieurs intervalles de dates.
    ne correspond t'elle pas à la description de votre problème ?

    Pour moi c'est la même chose.
    Qu'aurais-je raté ?

    Note : La syntaxe est celle d'Oracle, les scripts présentés ne fonctionnent pas tels quels sous PostgreSQL.
    Le savoir est une nourriture qui exige des efforts.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Si c'est la même chose, vous pouvez utiliser la méthode Tabibitosan pour créer un groupe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select t.*
           -- Méthode Tabibitosan
         ,   row_number() over (partition by empl_id order by d_start)
           - row_number() over (partition by Empl_id, pro_id order by d_start) as grp_tabibitosan
      from t;
    Il suffit de d'utiliser ce groupe généré dans le GROUP BY pour récupérer le MIN et le MAX des dates.

    Exemple (généré sous oracle, mais compatible avec postgresql sauf pour la génération des données exemple T) :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    SQL> with t as (
    select 1814 as Empl_id, 11 as pro_id, 'PROJETC' as projet, to_date('18/09/2017','dd/mm/yyyy') as d_start, to_date('09/10/2017','dd/mm/yyyy') as d_end from dual union all
    select 1814, 1457, 'PROJETB', to_date('10/10/2017','dd/mm/yyyy'),  to_date('16/10/2017','dd/mm/yyyy') from dual union all
    select 1814, 1457, 'PROJETB', to_date('17/10/2017','dd/mm/yyyy'),  to_date(' 29/10/2017','dd/mm/yyyy') from dual union all
    select 1814, 1457, 'PROJETB', to_date('30/10/2017','dd/mm/yyyy'),  to_date(' 12/11/2017','dd/mm/yyyy') from dual union all
    select 1814, 1457, 'PROJETB', to_date('13/11/2017','dd/mm/yyyy'),  to_date(' 01/01/2018','dd/mm/yyyy') from dual union all
    select 1814, 1457, 'PROJETB', to_date('02/01/2018','dd/mm/yyyy'),  to_date(' 05/08/2018','dd/mm/yyyy') from dual union all
    select 1814, 1457, 'PROJETB', to_date('06/08/2018','dd/mm/yyyy'),  to_date(' 23/12/2018','dd/mm/yyyy') from dual union all
    select 1814, 11, 'PROJETC', to_date('24/12/2018','dd/mm/yyyy'),  to_date(' 27/12/2018','dd/mm/yyyy') from dual union all
    select 1814, 11, 'PROJETC', to_date('28/12/2018','dd/mm/yyyy'),  to_date(' 06/01/2019','dd/mm/yyyy') from dual union all
    select 1814, 2482, 'PROJET_J', to_date('07/01/2019','dd/mm/yyyy'),  to_date(' 14/01/2019','dd/mm/yyyy') from dual union all
    select 1814, 2482, 'PROJET_J', to_date('15/01/2019','dd/mm/yyyy'),  to_date(' 10/03/2019','dd/mm/yyyy') from dual union all
    select 1814, 2614, 'PROJET_1', to_date('11/03/2019','dd/mm/yyyy'),  to_date(' 07/07/2019','dd/mm/yyyy') from dual
    )
    select t.*
           -- Méthode Tabibitosan
         ,   row_number() over (partition by empl_id order by d_start)
           - row_number() over (partition by Empl_id, pro_id order by d_start) as grp_tabibitosan
      from t;
     
       EMPL_ID     PRO_ID PROJET   D_START  D_END    GRP_TABIBITOSAN
    ---------- ---------- -------- -------- -------- ---------------
          1814         11 PROJETC  18/09/17 09/10/17               0
          1814       1457 PROJETB  10/10/17 16/10/17               1
          1814       1457 PROJETB  17/10/17 29/10/17               1
          1814       1457 PROJETB  30/10/17 12/11/17               1
          1814       1457 PROJETB  13/11/17 01/01/18               1
          1814       1457 PROJETB  02/01/18 05/08/18               1
          1814       1457 PROJETB  06/08/18 23/12/18               1
          1814         11 PROJETC  24/12/18 27/12/18               6
          1814         11 PROJETC  28/12/18 06/01/19               6
          1814       2482 PROJET_J 07/01/19 14/01/19               9
          1814       2482 PROJET_J 15/01/19 10/03/19               9
          1814       2614 PROJET_1 11/03/19 07/07/19              11
     
    12 ligne(s) selectionnee(s).
     
    SQL>
    Et donc la requête finale (j'ai retiré la partie génération des données exemple) :

    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 groupe as (
    select t.*
           -- Méthode Tabibitosan
         ,   row_number() over (partition by empl_id order by d_start)
           - row_number() over (partition by Empl_id, pro_id order by d_start) as grp_tabibitosan
      from t
    )
    select empl_id, pro_id, projet, min(d_start), max(d_end)
      from groupe
     group by empl_id, pro_id, projet, grp_tabibitosan
     order by min(d_start);  
     
       EMPL_ID     PRO_ID PROJET   MIN(D_ST MAX(D_EN
    ---------- ---------- -------- -------- --------
          1814         11 PROJETC  18/09/17 09/10/17
          1814       1457 PROJETB  10/10/17 23/12/18
          1814         11 PROJETC  24/12/18 06/01/19
          1814       2482 PROJET_J 07/01/19 10/03/19
          1814       2614 PROJET_1 11/03/19 07/07/19
     
    SQL>
    PS : J'ai considéré que le regroupement devait se faire par empl_id, si le empl_id n'a pas d'intérêt dans la définition du groupe Tabibitosan, retirez le du PARTITION BY et supprimez le 1er PARTITION BY.

  6. #6
    Futur Membre du Club
    Profil pro
    Cto
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Cto

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci

    Je ne connaissait pas cette technique de rupture, elle est top

    Tabibitosan est exactement ce que je voulais

    Merci à tous pour vos contributions

Discussions similaires

  1. [WS 2003] Import/export des groupes locaux sur windows serv 2003/2008
    Par xsadg dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 27/06/2012, 11h13
  2. fonction last pour group by
    Par mapmip dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 02/05/2012, 13h44
  3. RETAIN, LAST, FIRST, ARRAY ?
    Par benss13 dans le forum SAS Base
    Réponses: 1
    Dernier message: 10/01/2011, 16h31
  4. Réponses: 3
    Dernier message: 20/08/2010, 07h39
  5. Groupe de travail & windows 2000 pro.
    Par ylarvor dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 07/05/2007, 19h58

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