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 :

Comparer ligne à ligne


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Comparer ligne à ligne
    Bonjour,

    J'ai une requête (postgresql redshift) complexe a écrire et je ne sais absolument pas comment m'en sortir, peut-être que certains d'entre vous sauront m'éclairer.

    J'ai une table contenant les enregistrements suivant : (j'ai volontairement simplifié l'exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MaDate               |    MaPage
     
    10h10m 5s     |    page 1
    10h15m 5s     |    page 2
    10h20m 5s     |    page 3
    15h10m 5s     |    page 4
    J'aimerais calculer la durée de navigation d'un utilisateur si l'écart entre deux visites n'excède pas 30 minutes (valeur pouvant changer)

    J'ai donc pensé à récupérer les lignes dont l'écart entre deux date n'excède pas 30 minutes afin d'obtenir les lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaDate               |    MaPage
     
    10h10m 5s     |    page 1
    10h15m 5s     |    page 2
    10h20m 5s     |    page 3
    Il me suffira donc de récupérer le MIN(date) et MAX(date) et de faire la différence afin d'obtenir la durée de navigation, mais je ne sais absolument pas comment effectuer la première étape de mon raisonnement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DATEDIFF(minutes, MIN(MaDate), MAX(MaDate) FROM MaTable
    D'avance, je vous remercie !!!

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    Tournez vous du côté des fonctions de fenêtrage et en particulier lead / lag.
    http://www.postgresql.org/docs/9.2/s...ns-window.html

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci pour votre aide ! Je dois avouer que c'est relativement complexe comme fonctions :s

  4. #4
    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,

    comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH CTE(Duree) AS (
      SELECT   
        EXTRACT(EPOCH  FROM  
                LEAD(MaDate) OVER(ORDER BY MaDate) 
                - MaDate
        ) AS Duree
      FROM MaTable
     )
    SELECT 
      SUM(CASE WHEN Duree <= 30 * 60 THEN Duree END) As DureeTotaleEnSecondes
    FROM CTE

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup pour votre réponse !

    Je viens de me rendre compte que mon exemple était faussé car le jeu de données permettrait de ressortir plusieurs sessions avec des temps différents.

    Je vais essayer de reprendre mon exemple précédent en détaillant davantage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MaDate      |    MaPage
     
    10h10m     |    page 1 \
    10h15m     |    page 2  | Session 1 de 10h20 - 10h10 = 10 minutes
    10h20m     |    page 3 /
    15h05m     |    page 4 \
    15h15m     |    page 5  | Session 2 de 15h20 - 15h05 = 15 minutes
    15h20m     |    page 6 /
    16h05m     |    page 7 \
    16h10m     |    page 8  | Session 3 de 16h15 - 16h05 = 10 minutes
    16h15m     |    page 9 /
    Il peut donc y avoir plusieurs sessions de différentes durées. Pensez-vous que cela est possible avec la requête précédente ?

    Merci beaucoup !!

  6. #6
    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
    En effet

    Plutot comme ceci alors :

    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
     
    WITH CTE(MaDate,Duree) AS (
      SELECT  
        MaDate
        ,EXTRACT(EPOCH  FROM  
                MaDate 
                 - COALESCE(LAG(MaDate) OVER(ORDER BY MaDate) , MaDate)
     
        ) AS Duree
      FROM MaTable
     )
    ,Session AS (
      SELECT 
        MaDate
        ,Duree
        ,SUM(CASE WHEN Duree> 30 * 60 THEN 1 ELSE 0 END) OVER(ORDER BY MaDate) AS NoSession
      FROM CTE
      )
    SELECT 
      MIN(MaDate) AS Debut
      ,MAX(MaDate) AS Fin
      ,SUM(CASE WHEN Duree < 30 * 60 THEN Duree ELSE 0 END) AS Duree
    FROM Session
    GROUP BY NoSession

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup pour votre réponse ça fonctionne !!!

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

Discussions similaires

  1. Comparer des lignes
    Par Oxygene18 dans le forum Général Python
    Réponses: 6
    Dernier message: 01/03/2008, 18h18
  2. Comparer les lignes d'un fichier txt
    Par Casimir* dans le forum VBScript
    Réponses: 3
    Dernier message: 28/08/2007, 16h12
  3. comment comparer des lignes ou des colonnes
    Par juldace dans le forum SQL
    Réponses: 3
    Dernier message: 29/05/2007, 13h43
  4. [Tableaux] Comparer les lignes d'un même tableau
    Par derfatypik dans le forum Langage
    Réponses: 5
    Dernier message: 06/01/2006, 13h14
  5. Réponses: 5
    Dernier message: 09/01/2005, 20h54

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