MSQL2008 / Extraire autour de chaque lignes recherchées.
Résolu
HappyCulteur28
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
HappyCulteur28 Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
HappyCulteur28 Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
Bonjour.
J'ai une base de données sous SQL 2008.
La table est assez simple et ressemble a un journal de bord.
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 :
Avez vous une idée , une piste ou une solution?
Merci de votre aide.
David.
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:
- MSQL2008 / Extraire autour de chaque lignes recherchées.
- Extraire une video youtube - Guide
- Extraire le son d'une vidéo - Guide
- Google earth autour de moi - Guide
- Supermarché le moins cher autour de moi - Accueil - Services en ligne
- Partage de photos en ligne - Guide
3 réponses
Bonjour,
Tu peux tenter une requête de ce genre :
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
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
Bon.
J'ai trouvé cela .
Reste à voir si vous avez mieux .
Coté perf, je sais pas si cela est efficace .
David.
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.
Voici donc, avec la solution efficace de xavier :
Merci encore 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.
Je vais faire un comparatif perf , et reviens vers toi.
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.