MSQL2008 / Extraire autour de chaque lignes recherchées.

Résolu/Fermé
HappyCulteur28 Messages postés 5 Date d'inscription lundi 24 octobre 2016 Statut Membre Dernière intervention 24 octobre 2016 - 24 oct. 2016 à 11:35
HappyCulteur28 Messages postés 5 Date d'inscription lundi 24 octobre 2016 Statut Membre Dernière intervention 24 octobre 2016 - 24 oct. 2016 à 15:08
Bonjour.

J'ai une base de données sous SQL 2008.
La table est assez simple et ressemble a un journal de bord.

DateTime  ;  Text1
2016-10-11 00:00:01  'Message normal' 
2016-10-11 00:01:01  'Message normal'
2016-10-11 00:01:02  'Message normal'
2016-10-11 00:02:01  'Message normal' 
2016-10-11 00:04:01  'Message normal' 
2016-10-11 00:05:01  'Message Anomalie' 
2016-10-11 00:05:02  'Message normal' 
2016-10-11 00:10:01  'Message normal' 
2016-10-11 00:15:01  'Message normal'
2016-10-11 00:18:01  'Message normal'
2016-10-11 00:20:01  'Message Anomalie' 
2016-10-11 00:20:02  'Message normal' 
2016-10-11 00:21:01  'Message normal' 
2016-10-11 00:25:01  'Message normal' 
2016-10-11 00:30:01  'Message normal' 


Certains des messages Text1 représentent des anomalies qui peuvent survenir plusieurs fois dans la même journée.
Les messages normaux sont bien entendu différents .

J'aimerai faire une extraction pour chacune des ces anomalies des x min avant et y min apres, filtrant sur la base de temps, anomalie incluse.

L'objectif est d'avoir un journal épuré genre :
 2016-10-11 00:04:01  'Message normal' 
2016-10-11 00:05:01  'Message Anomalie' 
2016-10-11 00:05:02  'Message normal'
2016-10-11 00:18:01  'Message normal'
2016-10-11 00:20:01  'Message Anomalie' 
2016-10-11 00:20:02  'Message normal' 
2016-10-11 00:21:01  'Message normal' 


Avez vous une idée , une piste ou une solution?

Merci de votre aide.

David.
A voir également:

3 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié par Reivax962 le 24/10/2016 à 14:12
Bonjour,

Tu peux tenter une requête de ce genre :
SELECT DISTINCT t2.* FROM table t1
INNER JOIN table t2 ON t2.DateTime BETWEEN DATEADD(MINUTE, -5, t1.DateTime) AND DATEADD(MINUTE, 5, t1.DateTime)
WHERE t1.text1 = 'Message anomalie'

Le DISTINCT permet d'éviter les doublons, qui arriveront si deux anomalies sont trop rapprochées dans le temps.
Tu remplaces bien sûr table par le nom de ta table, et la clause WHERE par la condition qui te permet d'identifier un message d'anomalie.
Un bémol quand même, en termes de perf ce ne sera sans doute pas trop ça... Un index sur DateTime pourra s'avérer nécessaire, peut-être aussi sur ta condition de recherche des anomalies.

Xavier

PS : Là j'ai mis 5 minutes avant et après, tu mets bien sûr ce que tu veux.
La syntaxe de DATEADD est là : https://docs.microsoft.com/fr-fr/sql/t-sql/functions/dateadd-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15
1
HappyCulteur28 Messages postés 5 Date d'inscription lundi 24 octobre 2016 Statut Membre Dernière intervention 24 octobre 2016
24 oct. 2016 à 14:51
Merci de ta proposition qui s'est postée, juste avant la mienne.
Je vais faire un comparatif perf , et reviens vers toi.
0
HappyCulteur28 Messages postés 5 Date d'inscription lundi 24 octobre 2016 Statut Membre Dernière intervention 24 octobre 2016
24 oct. 2016 à 15:06
Ma version retourne bien les resultats, mais en 1min20.
Ta version, s'execute en 2 secondes ce qui est performant , MAIS ne retourne pas les bonnes choses.
Il manque des lignes ,notamment au début.
Je pense que cela provient du fait que j'ai plusieurs evenements avec le meme datetime.
J'ai fait un distinct sur DATETIME + Text1 .

Execution en moins d'une seconde.

Y a pas besoin de photo finish ! :)

MERCI Beaucoup.

David.
0
HappyCulteur28 Messages postés 5 Date d'inscription lundi 24 octobre 2016 Statut Membre Dernière intervention 24 octobre 2016
24 oct. 2016 à 14:49
Bon.
J'ai trouvé cela .
Reste à voir si vous avez mieux .
select	distinct(convert(nvarchar,a.datetime,121) + Text1)
		,a.DateTime
		,a.text1
		,b.Before
		,b.Post
		
			from	algviewExFra a,
					(
						select	DATEADD(minute,-1, DateTime) as [Before],
								DATEADD(minute,1, DateTime) as [Post]
									from  MyTable 
										where text1='Message Anomalie' 
								  ) b
				where 
							a.Datetime>=b.Before
						and	a.DateTime<=b.Post


Coté perf, je sais pas si cela est efficace .

David.
0
HappyCulteur28 Messages postés 5 Date d'inscription lundi 24 octobre 2016 Statut Membre Dernière intervention 24 octobre 2016
24 oct. 2016 à 15:08
Voici donc, avec la solution efficace de xavier :

SELECT DISTINCT	(convert(nvarchar,T2.datetime,121) + T2.Text1)
				,T2.DateTime
				,T2.text1 
			FROM MyTable t1
					INNER JOIN MyTable t2 ON t2.DateTime 
							BETWEEN		DATEADD(MINUTE, -1, t1.DateTime) 
									AND DATEADD(MINUTE, 1, t1.DateTime)
										WHERE t1.text1 = 'Message Anomaie'


Merci encore Xavier.
0