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

Langage SQL Discussion :

Regroupement de périodes de dates par critères


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Points : 131
    Points
    131
    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
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    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
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Points : 131
    Points
    131
    Par défaut
    Whoua, vraiment impressionnant, merci aieeeuuuuu !

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    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...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Points : 131
    Points
    131
    Par défaut
    Merci pour le lien

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

Discussions similaires

  1. incrémenter une date par une période de temps
    Par bilouk dans le forum VBA Access
    Réponses: 22
    Dernier message: 16/06/2023, 10h43
  2. Regroupement dates par période de 5 jours
    Par julien.Bourrier dans le forum R
    Réponses: 1
    Dernier message: 23/03/2017, 12h16
  3. 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, 08h21
  4. Etat regroupement Par date par jour
    Par bobosh dans le forum IHM
    Réponses: 2
    Dernier message: 01/08/2008, 09h03
  5. Réponses: 5
    Dernier message: 05/09/2007, 09h37

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