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

MS SQL Server Discussion :

Requête récursive et/ou fenêtrage dynamique


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    février 2004
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : février 2004
    Messages : 438
    Points : 207
    Points
    207
    Par défaut Requête récursive et/ou fenêtrage dynamique
    Bonjour,

    Je coince sur une requête depuis pas mal de temps ...
    J'ai dans ma base une courbe qui s'identifie de cette manière (datepoint, valeur) avec datepoint = une mesure au pas 10 minute.
    Cette courbe oscille entre 0 et +400 avec des longues périodes à 0 et des longues périodes à 400.

    Ce que je veux, c'est découper tous les jours à minuit cette courbe, et trouver le dernier point T0 ou la courbe monte, et le point T1 ou la courbe descend.

    Pour le moment j'ai ces requêtes mais qui fonctionne avec getDate() alors qu'il faudrait la faire évoluer récursivement par échantillon.
    Une idée ? Peut être qu'il faut que je regarde dans les clauses de fenêtrage type OVER PARTITION ?

    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
     
     
    -- DEMARRAGE
     
    SELECT pm1.grp_id, dateadd(mi,30, max (pm1.datepoint30)) AS dernier_demarrage
    FROM codap.gtm_prod_grp30mn_mixte pm1
    WHERE     pm1.prg_reel = 0
          AND pm1.grp_id IS NOT NULL
          AND pm1.datepoint30 < (SELECT max (pm2.datepoint30)
                                  FROM codap.gtm_prod_grp30mn_mixte pm2
                                  WHERE pm2.grp_id = pm1.grp_id
                                                       AND pm2.prg_reel > 0)
          AND pm1.datepoint30 < getdate()
    GROUP BY pm1.grp_id
     
    -- ARRET
     
    SELECT pm1.grp_id, max (pm1.datepoint30) AS dernier_arret
    FROM codap.gtm_prod_grp30mn_mixte pm1
    WHERE     pm1.prg_reel > 0
          AND pm1.grp_id IS NOT NULL
          AND pm1.datepoint30 <= (SELECT max (pm2.datepoint30)
                                  FROM codap.gtm_prod_grp30mn_mixte pm2
                                  WHERE pm2.grp_id = pm1.grp_id
                                                       AND pm2.prg_reel = 0                                                                                                      
                                                       )
          AND pm1.datepoint30 < getdate()
    GROUP BY pm1.grp_id

  2. #2
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    mai 2002
    Messages
    20 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : mai 2002
    Messages : 20 723
    Points : 49 092
    Points
    49 092
    Billets dans le blog
    1
    Par défaut
    Pour savoir si elle mponte ou descend il faut deux points :
    le point actuel et le précédent.
    Le précédent s'obtient avec LAG et calculer le différentiel. Si monte alors positif, sinon, négatif.
    Il s'agit ensuite de trouver, encore avec LAG les points qui se suivent et sont, l'un positif et le suivant négatif...

    Point de départ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CLEF, DATE_HEURE, VALEUR, LAG(VALEUR) OVER(PARTITION BY DATE(DATE_HEURE) ORDER BY DATE_HEURE) - VALEUR AS DIFF
    FROM   MA_TABLE
    Maintenant sans le DDL de vos tables et un jeu d'essais difficile d'aller plus loin. Merci de repecter la charte de postage !!!

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

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

Discussions similaires

  1. Requête récursive dans access
    Par Australia dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 29/07/2014, 15h15
  2. Réponses: 4
    Dernier message: 04/05/2006, 19h01
  3. [SQL Server]Problème avec une requête récursive
    Par evans dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/04/2006, 20h16
  4. [SQL Server] Requête récursive
    Par margagn dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/04/2006, 04h31
  5. Requête récursive
    Par tirixil dans le forum Bases de données
    Réponses: 3
    Dernier message: 07/03/2005, 16h11

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