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 :

Requête SQL selective sur une somme avec jointure


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 79
    Points : 54
    Points
    54
    Par défaut Requête SQL selective sur une somme avec jointure
    Bonjour,

    N'ayant pas un niveau assez élévé en SQL je me permets de poser ma question sur votre forum.

    Voila la situations (simplifiée ) :
    - 2 tables sql Users et Trackings
    - dans la table Trackings j'ai les colonnes "user_id", "time_spent" et "tracking_date"

    Objectif :
    - Sortir la date du dernier tracking qui a accumulé 90 minutes de "time_spent" et cela pour chaque utilisateurs.

    Exemple :
    - Jean a fait 10h de tracking entre janvier et mai. Cependant il a atteint les 1.5 heures de tracking le 14 février. C'est cette date (14 février) que j'aimerai voir apparaitre dans un tableau de Users.

    Résultat attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    user_id | tracking_date | total_time_spent
    ------------------------------------------------
         1  |  12-04-2016   |   10
         2  |  03-02-2016   |   9.3
         3  |  18-01-2016   |   1.5
    D'avance merci pour votre aide

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Deux solution :
    - Faire une auto-jointure sur "a.user_id = b.user_id and a.tracking_date < b.tracking_date", un sum sur b.time_spent puis filtrer avec un having pour ne récupérer que les valeurs > 1h30, et enfin faire une requête sur le résultat pour récupérer le min(a.tracking_time) pour chaque user retourné.
    - Faire un cumul progressif (sum over partion order by) et récupérer avec une sous-requête la première valeur > 1h30
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Solution 1 :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select user_id, min(tracking_date)
    from
    (
    	select t2.user_id, t2.tracking_date
    	from track t1
    	inner join track t2 on t2.user_id = t1.user_id and t2.tracking_date >= t1.tracking_date
    	group by t2.user_id, t2.tracking_date
    	having sum(t1.total_time_spent) >= 90
    ) tmp
    group by user_id

    Solution 2 :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select user_id, min(tracking_date)
    from
    (
    	select user_id, tracking_date, sum(total_time_spent) over (partition by user_id order by tracking_date) total
    	from track
    ) tmp
    where total >= 90
    group by user_id
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    Bonjour,
    MERCI pour votre double réponse ! c'est top.
    J'ai implémenté la méthode "sum over partition order by" qui réponds exactement a mon besoin tout en étant performant.
    encore merci et bonne continuation

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

Discussions similaires

  1. [MySQL] souci sur une requete avec jointure
    Par fey dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 08/09/2008, 11h11
  2. Besoin d'aide sur une requete avec jointure et MAX()
    Par droog dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/07/2007, 18h23
  3. Pb sur une requete avec jointure droite
    Par crashyear dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/02/2007, 08h06
  4. Réponses: 4
    Dernier message: 14/11/2006, 19h03

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