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

Développement SQL Server Discussion :

Dernière Valeur dans un group by


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Dernière Valeur dans un group by
    Bonjour tout le monde,

    pour vous mettre en contexte, j'ai une table contenant le statut d'une machine. Il y a une entrée à chaque changement de statut ou a chaque départ de machine.

    Dans le bout de code ci-dessous, je ramène mes valeurs à intervalle de 15 minutes. Ça marche très bien, mais je voudrais avoir comme valeur la dernière valeur du groupe en fonction du timestamp.

    Admettons que dans le même 15 minutes j'aie: 0,1,1,1,0
    AVG() me donnerait 0.4
    MIN(): 0
    MAX(): 1
    SUM():3

    Ce que je voudrais c'est un Last() ou un équivalent pour toujours avoir le dernier statut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT   DATEADD(MINUTE,(DATEDIFF(MINUTE,'19000101',Timestamp) / @IntervalMinutes) * @IntervalMinutes, '19000101')as Time, 
             tagname,
            AVG(Value) 
    FROM     #Data
    where Timestamp <= @EndDate and quality like '%GOOD%'
    GROUP BY DATEADD(MINUTE,(DATEDIFF(MINUTE,'19000101',Timestamp) / @IntervalMinutes) * @IntervalMinutes, '19000101'),
    		 tagname 
    ORDER BY Timestamp;
    Dans le bout de code ci-dessous, je voulais tenter de remplacer le AVG() par un select, mais je n'arrive juste pas à mettre les morceaux du puzzle ensemble. (Je sais que la syntaxe ne fait pas de sens, mais je voulais que vous ayez une idée de ce que je voulais faire...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT   DATEADD(MINUTE,(DATEDIFF(MINUTE,'19000101',Timestamp) / @IntervalMinutes) * @IntervalMinutes, '19000101')as Time, 
             tagname,
             Select Max(Timestamp), Value from #Data  -- Je veux récupérer la valeur du dernier timestamp de mon groupe
    FROM     #Data
    where Timestamp <= @EndDate and quality like '%GOOD%'
    GROUP BY DATEADD(MINUTE,(DATEDIFF(MINUTE,'19000101',Timestamp) / @IntervalMinutes) * @IntervalMinutes, '19000101'),
    		 tagname 
    ORDER BY Timestamp;
    Pour finir je suis convaincu, qu'il y a un moyen très simple de régler mon problème, mais je n'arrive pas à mettre le doigt dessus.

    J'espère que vous popurrez m'aider !

  2. #2
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT   DATEADD(MINUTE,(DATEDIFF(MINUTE,'19000101',Timestamp) / @IntervalMinutes) * @IntervalMinutes, '19000101')AS Time, 
             tagname,
            (
                 SELECT TOP 1 D.VALUE
                 FROM #Data D
                 WHERE DATEADD(MINUTE,(DATEDIFF(MINUTE,'19000101',D.Timestamp) / @IntervalMinutes) * @IntervalMinutes, '19000101')=
    DATEADD(MINUTE,(DATEDIFF(MINUTE,'19000101',D2.Timestamp) / @IntervalMinutes) * @IntervalMinutes, '19000101') ORDER BY D.Timestamp DESC
            ) as LastOne
    FROM     #Data D2
    WHERE Timestamp <= @EndDate AND quality LIKE '%GOOD%'
    GROUP BY DATEADD(MINUTE,(DATEDIFF(MINUTE,'19000101',Timestamp) / @IntervalMinutes) * @IntervalMinutes, '19000101'),
    		 tagname 
    ORDER BY Timestamp;
    Celà vous convient?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. [XSLT] comment grouper et vérifier une valeur dans ce groupe
    Par sylvie dans le forum XSL/XSLT/XPATH
    Réponses: 0
    Dernier message: 10/12/2010, 13h55
  2. Réponses: 3
    Dernier message: 25/10/2010, 15h11
  3. Re ordonner des valeurs dans un groupe
    Par stefsas dans le forum SAS Base
    Réponses: 2
    Dernier message: 11/06/2008, 15h50
  4. Réponses: 3
    Dernier message: 13/12/2006, 18h05
  5. Réponses: 14
    Dernier message: 25/09/2006, 13h03

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