Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/03/2011, 17h19   #1
Invité de passage
 
Karl Rioux
Inscription : avril 2004
Messages : 1
Détails du profil
Informations personnelles :
Nom : Karl Rioux

Informations forums :
Inscription : avril 2004
Messages : 1
Points : 0
Points : 0
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 :
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 :
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 !
HucKQC est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 10h46   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Code :
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?
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h34.


 
 
 
 
Partenaires

Hébergement Web