1. #1
    Membre habitué
    Inscrit en
    septembre 2002
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : septembre 2002
    Messages : 232
    Points : 130
    Points
    130

    Par défaut Regroupement de périodes de dates par critères

    Bonjour,

    Je ne parviens pas sans passer par une procédure stockée à faire une requête permettant de regrouper des données par période de date.

    Voici la structure de la table (Oracle)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_debut, date_fin, lieu
    contenant par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    date_debut1, date_fin1, lieu1
    date_debut2, date_fin2, lieu1
    date_debut3, date_fin3, lieu2
    date_debut4, date_fin4, lieu1
    mon objectif est d'obtenir comme résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    date_debut1, date_fin2, lieu1                      => Ici regroupement des 2 premières lignes car lieu identique et aucune autre date entre date_debut1 et date_fin2
    date_debut3, date_fin3, lieu2
    date_debut4, date_fin4, lieu1                      => ici pas de regroupement avec la première ligne car il y a une date_debut et/ou une date_fin d'un autre lieu entre les 2 lignes (date_debut3 et date_fin3)
    Est ce réalisable en une requete ? J'ai essayé un GROUP BY suivi d'un HAVING mais sans succès.

    Merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    4 585
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 585
    Points : 9 290
    Points
    9 290

    Par défaut

    Bonjour,

    Voici une solution, il y en a surement d'autres

    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
     
    WITH LaTable(date_debut, date_fin, lieu) AS (
    	 select 1, 3, 'lieu1'
    	union all select 5, 10, 'lieu1'
    	union all select 12, 14, 'lieu2'
    	union all select 16, 18, 'lieu1'
    ),
    Rupture AS (
    	SELECT 
    			date_debut
    		,	date_fin
    		,	lieu
    		,	CASE WHEN LAG(lieu) OVER(ORDER BY date_debut) = lieu THEN 0 ELSE 1 END AS new
    	FROM LaTable
    ),
    Groupage AS (
    	SELECT 
    			date_debut
    		,	date_fin
    		,	lieu
    		,	SUM(new) OVER(ORDER BY date_debut) AS Groupe
    	FROM rupture
    )
    SELECT 
    		MIN(date_debut) as debut
    	,	MAX(date_fin) as date_fin
    	,	lieu
    FROM	Groupage
    GROUP BY 
    			lieu
    		,	groupe

  3. #3
    Membre habitué
    Inscrit en
    septembre 2002
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : septembre 2002
    Messages : 232
    Points : 130
    Points
    130

    Par défaut

    Whoua, vraiment impressionnant, merci aieeeuuuuu !

  4. #4
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 333
    Points : 40 140
    Points
    40 140
    Billets dans le blog
    1

    Par défaut

    Ce que vous voulez faire est un agrégat d'intervalles (ou de périodes). Il existe différentes requêtes pour faire cela. Lisez l'article que j'ai écrit à ce sujet :
    https://blog.developpez.com/sqlpro/p...alles_en_sql_1

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  5. #5
    Membre habitué
    Inscrit en
    septembre 2002
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : septembre 2002
    Messages : 232
    Points : 130
    Points
    130

    Par défaut

    Merci pour le lien

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

Discussions similaires

  1. Regroupement dates par période de 5 jours
    Par julien.Bourrier dans le forum R
    Réponses: 1
    Dernier message: 23/03/2017, 13h16
  2. Regrouper date par période (supérieure à une année)
    Par Ramboleretour dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/04/2014, 09h21
  3. Etat regroupement Par date par jour
    Par bobosh dans le forum IHM
    Réponses: 2
    Dernier message: 01/08/2008, 10h03
  4. Réponses: 5
    Dernier message: 05/09/2007, 10h37
  5. incrémenter une date par une période de temps
    Par bilouk dans le forum VBA Access
    Réponses: 21
    Dernier message: 22/01/2007, 16h10

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