Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment faire un "Group By" sur un champ DateTime en fonction d'une période d'échantillonnage ?

3 réponses
Avatar
herve maillard
Bonjour,

J'ai une table avec la structure suivante :

Variable date_heure Valeur
var1 12/06/03 06:00:00 18
var1 12/06/03 06:00:05 21
var1 12/06/03 06:00:17 23
var1 12/06/03 06:00:23 89
var1 12/06/03 06:00:28 56
var1 12/06/03 06:00:37 23
var1 12/06/03 06:00:50 23

J'ai besoin d'extraire les valeurs en fonction d'une période de temps (par
exemple 1 points minimum toutes les 10 secondes).

Ce qui donnerais le résultat suivant :
Variable date_heure Valeur
var1 12/06/03 06:00:00 18
var1 12/06/03 06:00:17 23
var1 12/06/03 06:00:28 56
var1 12/06/03 06:00:37 23
var1 12/06/03 06:00:50 23

Comment faire cela ? J'ai pensé à un Group by mais comment exactement ?

Merci de votre aide...

H. MAILLARD

3 réponses

Avatar
bruno reiter [MVP]
select convert(char(18),madate,121)
from ...
group by convert(char(18),madate,121)

br

"herve maillard" wrote in message
news:3f053f01$0$5277$
Bonjour,

J'ai une table avec la structure suivante :

Variable date_heure Valeur
var1 12/06/03 06:00:00 18
var1 12/06/03 06:00:05 21
var1 12/06/03 06:00:17 23
var1 12/06/03 06:00:23 89
var1 12/06/03 06:00:28 56
var1 12/06/03 06:00:37 23
var1 12/06/03 06:00:50 23

J'ai besoin d'extraire les valeurs en fonction d'une période de temps (par
exemple 1 points minimum toutes les 10 secondes).

Ce qui donnerais le résultat suivant :
Variable date_heure Valeur
var1 12/06/03 06:00:00 18
var1 12/06/03 06:00:17 23
var1 12/06/03 06:00:28 56
var1 12/06/03 06:00:37 23
var1 12/06/03 06:00:50 23

Comment faire cela ? J'ai pensé à un Group by mais comment exactement ?

Merci de votre aide...

H. MAILLARD






Avatar
Fred BROUARD
1) créer une table supplémentaire pour gérer les tranches de l'échantillon
2) faire une jointure avec cette table par un between
3) calculer l'agrégat

Exemple :

CREATE TABLE T_ECHANTILLON_ECT
(ECT_ID INT NOT NULL IDENTITY PRIMARY KEY,
ECT_TRANCHE_BORNE_BASSE DATETIME NOT NULL,
ECT_TRANCHE_BORNE_HAUTE DATETIME NOT NULL)

INSERT INTO T_ECHANTILLON_ECT ('2003-06-12 06:00:00.000', '2003-06-12
06:00:09.999')
INSERT INTO T_ECHANTILLON_ECT ('2003-06-12 06:00:10.000', '2003-06-12
06:00:19.999')
INSERT INTO T_ECHANTILLON_ECT ('2003-06-12 06:00:20.000', '2003-06-12
06:00:29.999')
INSERT INTO T_ECHANTILLON_ECT ('2003-06-12 06:00:30.000', '2003-06-12
06:00:39.999')

SELECT MIN(Variable), ECT_TRANCHE_BORNE_BASSE, MIN(Valeur)
FROM MaTable T
JOIN T_ECHANTILLON_ECT ECT
ON T.date_heure BETWEEN ECT.ECT_TRANCHE_BORNE_BASSE
AND ECT.ECT_TRANCHE_BORNE_HAUTE
GROUP BY T.date_heure, ECT.ECT_TRANCHE_BORNE_BASSE,
ECT.ECT_TRANCHE_BORNE_HAUTE

A +


herve maillard a écrit:
Bonjour,

J'ai une table avec la structure suivante :

Variable date_heure Valeur
var1 12/06/03 06:00:00 18
var1 12/06/03 06:00:05 21
var1 12/06/03 06:00:17 23
var1 12/06/03 06:00:23 89
var1 12/06/03 06:00:28 56
var1 12/06/03 06:00:37 23
var1 12/06/03 06:00:50 23

J'ai besoin d'extraire les valeurs en fonction d'une période de temps (par
exemple 1 points minimum toutes les 10 secondes).

Ce qui donnerais le résultat suivant :
Variable date_heure Valeur
var1 12/06/03 06:00:00 18
var1 12/06/03 06:00:17 23
var1 12/06/03 06:00:28 56
var1 12/06/03 06:00:37 23
var1 12/06/03 06:00:50 23

Comment faire cela ? J'ai pensé à un Group by mais comment exactement ?

Merci de votre aide...

H. MAILLARD







--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************
Avatar
herve maillard
Merci Fred pour cette solution.

Le problème c'est que ta solution impose de créer une table temporaire. Les
problèmes liés à cette table sont les suivants :

1/ Cela ne marche pas si plusieurs utilisateur interroge la base en même
temps...
2/ Il faut remplir la table temporaire (ce qui risque d'être long )
3/ les dates et heures ajoutées dans la table temporaire doivent
obligatoirement exister sous peine de perdre une période...(or ce n'est pas
forcément le cas,en effet la période demandée est une période minimum, rien
ne garantie que toutes les 10 secondes par exemple, il y aura un point
existant dans la table de données...).

David Porta m'a fournit la solution suivante :

CREATE TABLE Sometable (variable CHAR(4) NOT NULL, date_hour DATETIME NOT
NULL, value INTEGER NOT NULL, PRIMARY KEY (variable,date_hour))

INSERT INTO Sometable VALUES ('var1', '2003-06-12T06:00:00', 18)
INSERT INTO Sometable VALUES ('var1', '2003-06-12T06:00:05', 21)
INSERT INTO Sometable VALUES ('var1', '2003-06-12T06:00:17', 23)
INSERT INTO Sometable VALUES ('var1', '2003-06-12T06:00:23', 89)
INSERT INTO Sometable VALUES ('var1', '2003-06-12T06:00:28', 56)
INSERT INTO Sometable VALUES ('var1', '2003-06-12T06:00:37', 23)
INSERT INTO Sometable VALUES ('var1', '2003-06-12T06:00:50', 23)

DECLARE @samp_period INTEGER
SET @samp_period = 10

SELECT S1.*
FROM Sometable AS S1
JOIN
(SELECT variable, MIN(date_hour) AS date_hour
FROM Sometable
GROUP BY variable, FLOOR(DATEDIFF(SECOND, '20000101', date_hour) /
@samp_period)) AS S2
ON S1.variable = S2.variable AND S1.date_hour = S2.date_hour

Cela fonctionne bien mais par contre les temps de traitement sont énormes...
Je ne sais pas trop comment faire pour optimiser cela...

J'en suis à me demander si cela n'irais pas plus vite de ramener toute les
infos et de la filtrer dans mon soft...

J'envisage sinon d'ajouter un champ dans ma table indiquant le nombre de
secondes séparant le dernier point...
Ce qui me donnerait la structure suivante :

var1 12/06/03 06:00:00 18 NULL
var1 12/06/03 06:00:05 21 5
var1 12/06/03 06:00:17 23 12
var1 12/06/03 06:00:23 89 6
var1 12/06/03 06:00:28 56 5
var1 12/06/03 06:00:37 23 9
var1 12/06/03 06:00:50 23 13

Comment faire maintenant pour extraire un point tous les 10 secondes par
exemple...

Merci de votre aide...

H. MAILLARD

"herve maillard" wrote in message
news:3f053f01$0$5277$
Bonjour,

J'ai une table avec la structure suivante :

Variable date_heure Valeur
var1 12/06/03 06:00:00 18
var1 12/06/03 06:00:05 21
var1 12/06/03 06:00:17 23
var1 12/06/03 06:00:23 89
var1 12/06/03 06:00:28 56
var1 12/06/03 06:00:37 23
var1 12/06/03 06:00:50 23

J'ai besoin d'extraire les valeurs en fonction d'une période de temps (par
exemple 1 points minimum toutes les 10 secondes).

Ce qui donnerais le résultat suivant :
Variable date_heure Valeur
var1 12/06/03 06:00:00 18
var1 12/06/03 06:00:17 23
var1 12/06/03 06:00:28 56
var1 12/06/03 06:00:37 23
var1 12/06/03 06:00:50 23

Comment faire cela ? J'ai pensé à un Group by mais comment exactement ?

Merci de votre aide...

H. MAILLARD