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 22/06/2011, 16h42   #1
Invité de passage
 
Inscription : mai 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 8
Points : 1
Points : 1
Par défaut Problème différences de valeurs

Bonjour,

J'ai actuellement un problème pour faire la différence entre 2 valeurs d'une table
Tout d'abord voici la requête:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SELECT	DATEPART(year, DateTime) AS ANNEE
	,DATEPART(week ,DateTime) AS SEM
	,ETF1 = CASE
		WHEN max(value) IS NULL THEN 0
		ELSE max(value)-min(value)
		END
 
FROM	Runtime.dbo.AnalogHistory 
 
WHERE	TagName = 'RWT_CPT_ETCF'
AND	DateTime >= DATEADD(year, DATEDIFF(year, 0, GETDATE()), 0)
 
GROUP	BY DATEPART(year, DateTime), DATEPART(week ,DateTime)
ORDER	BY DATEPART(year, DateTime), DATEPART(week ,DateTime)
Et le résultat renvoyé:
http://imageshack.us/photo/my-images/233/tabley.png/

Ici, le problème est que le capteur qui me remonte l'information (données de la consommation d'eau sur une ligne) se remet à 0 tous les 9999m3

Du coup, peut être l'aurais vous déjà remarqué au niveau des résultats renvoyés, chaque fois que la valeur se remet à 0 le résultat de la différence entre la valeur max et min est faussé (pour exemple on peut voir que la valeur 9257 en semaine 3)

Juste pour info voici le résultat renvoyé si je demande uniquement la valeur max: Me renvoie le résultat:
http://imageshack.us/photo/my-images/109/table2e.png/

Merci de toute aide que vous pourriez me fournir
Kyllak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 11h17   #2
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Citation:
Envoyé par Kyllak Voir le message
Ici, le problème est que le capteur qui me remonte l'information (données de la consommation d'eau sur une ligne) se remet à 0 tous les 9999m3
Il vous faut donc avant ce traitement suffisamment corriger la perte de précision de vos données.

Vous utilisez quelle version ?
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 13h30   #3
Invité de passage
 
Inscription : mai 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 8
Points : 1
Points : 1
Tout d'abord merci de prêter attention à mon sujet
La version SQL utilisé est la 2005
Kyllak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 14h30   #4
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Est-ce que votre objectif est de mesurer la consommation hebdomadaire ?
Auquel cas, il vous faut mesurer non pas la différence entre la plus grande et la plus petite valeur dans la semaine mais la différence entre la dernière valeur de la semaine et celle de la semaine précédente.
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 14h39   #5
Invité de passage
 
Inscription : mai 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 8
Points : 1
Points : 1
En effet c'est bien une historisation hebdomadaire qui m'intéresse et c'est dans ce cas où j'ais du mal à formuler ma requête
Kyllak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 15h12   #6
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
Avant de chercher compliqué, c'est quoi le type de Value ?
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 16h14   #7
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Le plus simple (en terme d'écriture et de lecture du query) est sans doute de faire une CTE récursive.

Je pense qu'une table variable correctement utilisée pourrait aussi être utile dans votre cas.

Code :
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
DECLARE @tbl TABLE (
 ROW INT PRIMARY KEY
 , ANNEE INT
 , SEM INT
 , Value DECIMAL(??, ??)

 , UNIQUE (TSEM, ANNEE, SEM, ROW)
 , UNIQUE (TSEM, ROW)
)

INSERT @tbl (
 ROW
 , ANNEE
 , SEM
 , Value
)
 SELECT
 ROW_NUMBER() OVER (ORDER BY DateTime ASC) AS ROW
 , DATEPART(year, DateTime) AS ANNEE
 , DATEPART(week ,DateTime) AS SEM
 , DATEDIFF(week, 0, DateTime) AS TSEM
 , Value
FROM	Runtime.dbo.AnalogHistory 
WHERE	TagName = 'RWT_CPT_ETCF'
AND	DateTime >= DATEADD(year, DATEDIFF(year, 0, GETDATE()), 0)

; WITH CTE AS (
SELECT
T.ANNEE
, T.SEM
, T.TSEM 
, T.ROW
, ISNULL(T2.Value, 0) AS Value
, 0.0 AS Diff
FROM (
SELECT
ANNEE
, SEM
, TSEM 
,  MIN(ROW) AS ROW
FROM @tbl
GROUP BY
ANNEE
, SEM
, TSEM 
) AS T
LEFT JOIN @tbl AS T2 ON (
 T2.ROW = T.ROW - 1
)

UNION ALL

SELECT
T.ANNEE
, T.SEM
, T.TSEM 
, T2.ROW
, V.Value
, T.Diff + ISNULL(V.Value, T.Value) - T.Value
FROM CTE AS T
LEFT JOIN @tbl AS T2 ON (
 T2.ROW = T.ROW + 1 -- Ligne suivante
 AND
 T2.TSEM = T.TSEM -- Même semaine
)
OUTER APPLY (
 SELECT CASE T2.Value < T.Value THEN T2.Value + 1000 ELSE T2.Value END
) V(Value)
WHERE T.Value IS NOT NULL
)

SELECT
ANNEE
, SEM
, Diff
FROM CTE 
WHERE Value IS NULL
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 09h07   #8
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
Bonjour,
-1 pour la colonne nommée datetime!

Sinon vous avez un relevé journalier des consommations?
Il est aisé de savoir quand le compteur se remet à 0 (valeur du jour< valeur de la veille... en partant du principe que vous ne pouvez faire plus de 10000 dans la journée)...

A partir de là le reste est trivial...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 11h15   #9
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Citation:
Envoyé par iberserk Voir le message
A partir de là le reste est trivial...
Ou pas...
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 11h55   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Avec une auto jointure, pour vérifier la valeur "précédente" (pas testé):


Code SQL :
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
 
;WITH CTE AS (
	SELECT	
		[DateTime] AS DateHeure,
		value,
		ROW_NUMBER() OVER (ORDER BY [DateTime]) AS RN
	FROM	Runtime.dbo.AnalogHistory 
	WHERE	TagName = 'RWT_CPT_ETCF'
)
SELECT 
	DATEPART(year, C1.DateHeure) AS ANNEE,
	DATEPART(week ,C1.DateHEure) AS SEM,
	SUM (
		CASE 
			WHEN C1.value > COALESCE(C2.value, 0) THEN 
				c1.value - c2.value
			ELSE
				c1.value - c2.value + 10000
		END
	) AS Conso 
FROM CTE C1
LEFT OUTER JOIN CTE C2 --ligne "précédente" par rapport à datetime
	ON C1.RN  = C2.RN + 1
WHERE C1.DateHeure >= DATEADD(year, DATEDIFF(year, 0, GETDATE()), 0)
GROUP BY DATEPART(year, DateTime), DATEPART(week ,DateTime)
ORDER BY DATEPART(year, DateTime), DATEPART(week ,DateTime)

Le filtre sur la date pourrait être mis dans la CTE, mais il manquerait alors la valeur précédente de la première ligne, ce qui peut être corrigé autrement (par exemple une requête dans le COALESCE...)...
aieeeuuuuu 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 05h42.


 
 
 
 
Partenaires

Hébergement Web