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 :

[SQL] Detecter une coupure dans une timeline


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 88
    Points : 57
    Points
    57
    Par défaut [SQL] Detecter une coupure dans une timeline
    Bonjour

    j'ai une table qui contient des enregistrement de durée
    de à
    1 3
    2 5
    3 5
    4 6
    7 8


    j'aimerai pouvoir détecté qu'il y a une coupure dans la timeline entre 6 et 7

    Quelqu'un a une idée de comment faire ca en SQL? car je seche méchament :s

    Merci bien!

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Quel est votre SGBD ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 88
    Points : 57
    Points
    57
    Par défaut
    mysql ^^

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Tu ne peux donc pas utiliser de fonctions analytiques, c'est moche, ça aurait simplifié le travail.
    Sans fonction analytique, sous Oracle j'aurai fait quelque chose comme ça :
    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
    select t1.a as de, t2.de as a from
    (
    	select t.*, rownum as position
    	from
    	(
    		select t.*
    		from timeline t
    		order by de, a
    	) t
    ) t1
    left join
    (
    	select t.*, rownum as position
    	from
    	(
    		select t.*
    		from timeline t
    		order by de, a
    	) t
    ) t2
    on t1.position = t2.position-1
    where t1.a < t2.de
    Seulement, je ne connais pas MySQL, et j'ai du mal à trouver un équivalent de rownum sur le net... peut être que quelqu'un saura adapter
    A noter, si des intervalles peuvent être inclus dans d'autres, il faudra les enlever de la selection, sans quoi on pourrait remonter un résultat faux.

    EDIT : ajout d'un NOT EXISTS pour ne pas récupérer les intervalles inclus dans 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
    32
    33
    34
    select t1.a as de, t2.de as a from
    (
    	select t.*, rownum as position
    	from
    	(
    		select t.*
    		from timeline t
    		where not exists
    			  (
    			   select * 
    			   from timeline
    			   where t.de >= de and t.a < a
    			  )
    		order by de, a
    	) t
    ) t1
    left join
    (
    	select t.*, rownum as position
    	from
    	(
    		select t.*
    		from timeline t
    		where not exists
    			  (
    			   select * 
    			   from timeline
    			   where t.de >= de and t.a < a
    			  )
    		order by de, a
    	) t
    ) t2
    on t1.position = t2.position-1
    where t1.a < t2.de
    EDIT bis : faute de mieux, vous pouvez tenter ceci, je ne sais pas si ce sera très pratique d'utiliser cette astuce dans votre cas (ni même si ça fonctionne vraiment, n'ayant rien pour tester...) :
    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
    mysql> SET @rownum1 := 0;
    mysql> SET @rownum2 := 0;
    mysql>
    select t1.a as de, t2.de as a from
    (
    	select t.*, @rownum1 := @rownum1 + 1 as position
    	from timeline t
    	where not exists
    		(
    		select * 
    		from timeline
    		where t.de >= de and t.a < a
    		)
    	order by t.de, t.a
    ) t1
    left join
    (
    	select t.*, @rownum2 := @rownum2 + 1 as position
    	from timeline t
    	where not exists
    		(
    		select * 
    		from timeline
    		where t.de >= de and t.a < a
    		)
    	order by t.de, t.a
    ) t2
    on t1.position = t2.position-1
    where t1.a < t2.de

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Ce genre de requête est un agrégat d'intervalle. Lire le papier que je vient de poster dans mon blog à ce sujet.

    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/ * * * * *

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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