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 par intervalle < 5min


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut Regroupement par intervalle < 5min
    Bonjour,

    je bute sur cette requete depuis ce matin.
    Ca correspond a des données de session en fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    heure         pers
    ------------------
    08:34         XX
    08:37         XX
    08:42         XX
    09:58         YY
    10:12         YY
    10:25         YY
    10:26         YY
    16:25         XX
    je voudrais ne retourner qu'un ligne tant qu'il n'y a pas une différence de plus de 5min entre les heures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    heure         pers
    ------------------
    8:34          XX
    09:58         YY
    10:12         YY
    16:25         XX
    J'espere avoir été clair,

    Merci.

  2. #2
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    je dirais

    1°) tu calcules le delta entre chaque heures de connexion d'un même individu
    2°) tu supprimes toutes les lignes avec un delta < 5 minutes
    3°) voila


    en une seule requête, je ne vois pas dsl.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    comment calculer le delta entre deux connexions? Une requete imbriquée avec une auto-jointure ?

    Merci

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 786
    Points
    30 786
    Par défaut
    La requête s'écrit comme elle s'énonce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  heure  
        ,   pers
    FROM    matable AS t1
    WHERE   NOT EXISTS
            (   SELECT  1
                FROM    matable AS t2
                WHERE   t1.heure <= t2.heure + INTERVAL 5 MINUTE
                    AND t1.pers = t2.pers 
            )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Merci de vos réponse,
    le suggestion de al1_24 ne semble pas fonctionner.
    Si j'ai bien compris, on veut évincer, les lignes ou la connexion est < 5min avec le "NOT EXIST".

    Merci

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Citation Envoyé par prophete3d Voir le message
    Si j'ai bien compris, on veut évincer, les lignes ou la connexion est < 5min avec le "NOT EXIST".
    Tu as bien compris...
    Citation Envoyé par prophete3d Voir le message
    le suggestion de al1_24 ne semble pas fonctionner.
    En effet, je me suis trompé dans l'expression du filtre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                WHERE   t1.heure <= t2.heure - INTERVAL 5 MINUTE
    Il est possible que ton SGBD ne prenne pas en charge les types INTERVAL. Mais comme tu n'as pas précisé avec lequel tu travaillais, j'ai utilisé une syntaxe normalisée...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    J'utilise SQL SERVER 2000.
    J'ai fait la requete, qui apres reflexion me semble logique, mais cela ne fonctionne pas. J'ai remplacé le "INTERVAL" par un DATEADD.
    Il ne me retourne que la derniere connexion en fait.

    Merci !

    EDIT: je pense avoir trouvé une solution parallèle, qui n'est peut etre pas propre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT t1.pers, t1.heure, 
               DATEDIFF(minute, (SELECT MAX(t2.heure) 
                                         FROM matable AS t2 
                                         WHERE t2.heure < t1.heure), t1.heure) AS diff
    FROM matable AS t1
    Je n'ai plus qu'a évincé les valeurs <= 5 de la colonne diff

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Toutes mes excuses, j'ai adapté un peu rapidement une requête que j'avais déjà développée pour des intervalles fixes (et non inférieurs à une certaine valeur)
    Dans ton cas ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  heure  
        ,   pers
    FROM    matable AS t1
    WHERE   NOT EXISTS
            (   SELECT  1
                FROM    matable AS t2
    --            WHERE   t1.heure - t2.heure <= INTERVAL 5 MINUTE
                 WHERE   DATEDIFF(minute, t1.heure, t2.heure) <= 5
                   AND t1.heure > t2.heure 
                    AND t1.pers = t2.pers 
            )
    ;
    Rien de tel qu'une requête un peu complexe pour s'amuser... quand on a un peu de temps
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Bonjour prophete3d,

    je ne suis pas sûr d'avoir compris ta question. Dans l'exemple que tu donnes, pourquoi l'heure 10:12 ne doit-elle pas être renvoyée par la requête ?
    Si 10:12 doit bien faire partie des résultats, je te propose la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT   heure,
             pers
    FROM     T AS T1
    WHERE    heure >  ALL (SELECT DateAdd('n',5,heure)
                           FROM   T
                           WHERE  heure < T1.heure)
    ORDER BY heure
    Maintenant, que doit-il se passer si, à ton jeu de test précédent, j'ajoute 2 lignes, pour obtenir le jeu de test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    heure         pers
    ------------------
    08:34         XX
    08:37         XX
    08:42         XX
    09:58         YY
    10:12         YY
    10:25         YY
    10:26         YY
    16:25         XX
    22:19         XX
    22:19         YY
    Toutes les lignes 22:19 doivent-elle ressortir ou ne doit-on en garder qu'une ?
    Si on ne doit en garder qu'une (22:19 XX ou 22:19 YY donc), tu peux compléter la requête précédente ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT   heure,
             FIRST(pers)
    FROM     T AS T1
    WHERE    heure >  ALL (SELECT DateAdd('n',5,heure)
                           FROM   T
                           WHERE  heure < T1.heure)
    GROUP BY heure
    ORDER BY heure

    PS : requêtes écrites en SQL Access
    PPS : al1_24, je comprends le fonctionnement de ta requête, à l'exception de la condition Pourquoi filtres-tu ta sous-requête sur cette condition ?

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    merci pour vos réponses.
    Comme je le pensais, ma solution est extrement lourde, logique.
    Pour j1, c'est en effet 10:12, qu'il faut renvoyer, erreur de frappe, excusez moi.

    Je teste de ce pas vos propositions.

    Merci de votre aide !

    edit : la solution semble fonctionner en modifiant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE   DATEDIFF(minute, t2.heure, t1.heure) <= 5

  11. #11
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Problème résolu donc, merci à tous pour votre aide.
    Pour info, les deux requetes me renvoie les memes résultats mais le temps d'exécution est différent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    prophete3d : sur 1 mois => 49s, sur 1 an => 23min33s
    al1_24 : sur 1 mois => 6s, sur 1 an => 1min12s
    Y'a pas photo comme on dit.

    Merci

  12. #12
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Citation Envoyé par prophete3d Voir le message
    Problème résolu donc, merci à tous pour votre aide.
    Pour info, les deux requetes me renvoie les memes résultats mais le temps d'exécution est différent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    prophete3d : sur 1 mois => 49s, sur 1 an => 23min33s
    al1_24 : sur 1 mois => 6s, sur 1 an => 1min12s
    Y'a pas photo comme on dit.

    Merci
    Par curiosité, ça correspond à combien de lignes traitées ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    pour une année je dirais un peu plus de 500 000.

    A bientot

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

Discussions similaires

  1. Regrouper les données par intervalle
    Par jlegal dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 17/02/2012, 22h21
  2. requete regroupement par intervalle
    Par Msysteme dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/12/2009, 23h46
  3. Requete de regroupement par intervalle
    Par tonio-lille dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 26/01/2007, 16h22
  4. regroupement par intervalle de 24h
    Par habasque dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/11/2006, 17h39
  5. regroupement par intervalle de 24h
    Par habasque dans le forum Oracle
    Réponses: 2
    Dernier message: 08/11/2006, 10h49

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