IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Supprimer deux lignes successives non identiques


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de korospoukine
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2006
    Messages : 176
    Points : 175
    Points
    175
    Par défaut Supprimer deux lignes successives non identiques
    Bonjour,

    Voici mon problème :
    J'ai mis en place un serveur syslog pour logguer des équipements, toutes les infos sont insérées en base de données MSSQL 2008R2.
    Deux fois par jour des scrips intéroges ces equipements ce qui genere beaucoup de log inutiles

    Voici le nom des champs :
    ID en auto increment, Date, Source, Message, Priorité
    158 Jan 25 14:16:43 10.173.28.30 ILOAdm logged out of the Onboard Administrator 1
    159 Jan 25 14:16:44 10.173.28.30 ILOAdm logged into the Onboard Administrator from 10.149.56.184 1
    160 Jan 25 14:16:45 10.173.28.30 ILOAdm logged out of the Onboard Administrator 1
    161 Jan 25 14:16:46 10.173.28.30 ILOAdm logged into the Onboard Administrator from 10.149.56.184 1
    162 Jan 25 14:16:47 10.173.28.30 ILOAdm logged out of the Onboard Administrator 1
    163 Jan 25 14:16:49 10.173.28.30 ILOAdm logged into the Onboard Administrator from 10.149.56.184 1
    164 Jan 25 14:16:50 10.173.28.30 ILOAdm logged out of the Onboard Administrator 1
    165 Jan 25 14:16:51 10.173.28.30 ILOAdm logged into the Onboard Administrator from 10.149.56.184 1
    166 Jan 25 14:16:53 10.173.28.30 ILOAdm logged out of the Onboard Administrator 1
    167 Jan 25 14:16:54 10.173.28.30 ILOAdm logged into the Onboard Administrator from 10.149.56.184 1
    168 Jan 25 14:16:56 10.173.28.30 ILOAdm logged out of the Onboard Administrator 1
    169 Jan 25 14:16:57 10.173.28.30 ILOAdm logged into the Onboard Administrator from 10.149.56.184 1
    170 Jan 25 14:16:59 10.173.28.30 ILOAdm logged out of the Onboard Administrator 1
    171 Jan 25 14:17:00 10.173.28.30 ILOAdm logged into the Onboard Administrator from 10.149.56.184 1
    172 Jan 25 14:17:01 10.173.28.30 ILOAdm logged out of the Onboard Administrator 1
    Je souhaite supprimer les pairs suivantes :
    ID x Message = 'ILOAdm logged into the Onboard Administrator from 10.149.56.184'
    ID x+1 Message ='ILOAdm logged out of the Onboard Administrator'

    Je sais supprimer une ligne, mais deux successives qui reunisse deux conditions, la je sèche.

    Merci d'avance de votre aide.

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Pour faire simple, je passerais par une table temporaire stockant les id.

  3. #3
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Utilise condition avec OR ou IN


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ....
    where condition1 OR condition2
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  4. #4
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Ici il faut quand même signaler que le OR va devoir utiliser une sous-condition avec EXISTS.

    Quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DELETE t 
     FROM tableLog t
    WHERE (message =  Message = 'ILOAdm logged into the Onboard Administrator from 10.149.56.184' 
    AND EXISTS ( SELECT 1 FROM tableLog t1 WHERE t1.id = t.id+1 AND t1.Message = 'ILOAdm logged out of the Onboard Administrator')
    )
    OR 
    ( Message = 'ILOAdm logged out of the Onboard Administrator'
    AND EXISTS ( SELECT 1 FROM tableLog t2 WHERE t2.id = t.id-1 AND t2.Message = 'ILOAdm logged into the Onboard Administrator from 10.149.56.184' )
    )

  5. #5
    Membre habitué Avatar de korospoukine
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2006
    Messages : 176
    Points : 175
    Points
    175
    Par défaut
    Merci Rei Ichido pour ta réponse.

    Je vais regarder cela de plus près.
    Je ne vais prendre que cette partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DELETE t 
     FROM tableLog t
    WHERE (message =  Message = 'ILOAdm logged into the Onboard Administrator from 10.149.56.184' 
    AND EXISTS ( SELECT 1 FROM tableLog t1 WHERE t1.id = t.id+1 AND t1.Message = 'ILOAdm logged out of the Onboard Administrator')
    )
    La deuxième n'est pas utile à mon besoin.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Ou avec la fonction LAG qui va récupérer l'ID de la ligne qui suit.
    Et après on verifie la condition pour l'ID, et LAG(ID)

  7. #7
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par korospoukine Voir le message
    Merci Rei Ichido pour ta réponse.

    Je vais regarder cela de plus près.
    Je ne vais prendre que cette partie

    La deuxième n'est pas utile à mon besoin.
    Mais du coup ça ne supprimera que les lignes N, et pas les N+1.

  8. #8
    Membre habitué Avatar de korospoukine
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2006
    Messages : 176
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Mais du coup ça ne supprimera que les lignes N, et pas les N+1.
    Ok merci.

    Citation Envoyé par Rams7s Voir le message
    Ou avec la fonction LAG qui va récupérer l'ID de la ligne qui suit.
    Et après on verifie la condition pour l'ID, et LAG(ID)
    La fonction LAG n'est disponible que pour la version 2012, mais merci pour l'info.

  9. #9
    Membre habitué Avatar de korospoukine
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2006
    Messages : 176
    Points : 175
    Points
    175
    Par défaut
    J'ai modifié la requete et elle ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DELETE  t
    FROM OASystemEvents2 t
    WHERE (Mess LIKE '%ILOAdm logged into the Onboard Administrator from 10.149.56.184%' 
    AND EXISTS ( 
    SELECT 1 FROM OASystemEvents2 t1 WHERE t1.ID = t.ID+1 AND t1.Mess LIKE '%ILOAdm logged out of the Onboard Administrator%')
    )
    OR 
    (Mess LIKE '%ILOAdm logged out of the Onboard Administrator%'
    AND EXISTS ( 
    SELECT 1 FROM OASystemEvents2 t2 WHERE t2.ID = t.ID-1 AND t2.Mess LIKE '%ILOAdm logged into the Onboard Administrator from 10.149.56.184%')
    )
    Je l'ai executé et il ne m'a supprimé que les entrées avec 'ILOAdm logged into the Onboard Administrator from 10.149.56.184'
    Si je fait un SELECT * à la place d'un DELETE t je récupère les bonnes infos

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    étrange comme comportement, etes-vous sûr de votre analyse ?

    que donne cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DELETE FROM T
    	FROM		TableLog T
    	INNER JOIN	TableLog prec
    		ON		prec.id = T.id - 1
    WHERE	(
    				T.message = 'ILOAdm logged into the Onboard Administrator from 10.149.56.184' 
    		AND		prec.message = 'ILOAdm logged out of the Onboard Administrator'
    		)
    	OR	
    		(
    				T.message = 'ILOAdm logged out of the Onboard Administrator' 
    		AND		prec.message = 'ILOAdm logged into the Onboard Administrator from 10.149.56.184'
    		)

  11. #11
    Membre habitué Avatar de korospoukine
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2006
    Messages : 176
    Points : 175
    Points
    175
    Par défaut
    Je viens de tester la requête et elle supprime tout sauf la première occurrence.
    Si je mets un SELECT *
    La première occurence est ILOAdm logged out of the Onboard Administrator
    Suivie de ILOAdm logged into the Onboard Administrator from 10.149.56.184
    Et finie par ILOAdm logged out of the Onboard Administrator

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Je viens de tester la requete et elle supprime tout sauf la première aucurence
    sur le jeu de données que vous aviez fournis, c'est ce que vous vouliez non ?
    La première ligne est la seule qui ne fasse pas partie d'un couple, donc toutes les autres doivent être supprimées

  13. #13
    Membre habitué Avatar de korospoukine
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2006
    Messages : 176
    Points : 175
    Points
    175
    Par défaut
    Excusez moi de vous avoir induit en erreur.
    Pour moi le couple est obligatoirement
    En premier : 'ILOAdm logged into the Onboard Administrator from 10.149.56.184'
    Suivi de 'ILOAdm logged out of the Onboard Administrator'
    Si sur la ligne N-1 j'ai 'ILOAdm logged out of the Onboard Administrator', la ligne doit restée

  14. #14
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    mea culpa, je n'ai copié la bonne requête, d'un point de vue sémantique, celle-ci est pus correcte je pense


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    DELETE FROM T
    	FROM	TableLog T
    	LEFT JOIN	TableLog prec
    		ON			prec.id = T.id - 1
    	LEFT JOIN	TableLog suiv
    		ON			suiv.id = T.id + 1
    WHERE	(
    				T.message = 'ILOAdm logged into the Onboard Administrator from 10.149.56.184' 
    		AND		suiv.message = 'ILOAdm logged out of the Onboard Administrator'
    		)
    	OR	
    		(
    				prec.message = 'ILOAdm logged into the Onboard Administrator from 10.149.56.184'
    		AND		T.message = 'ILOAdm logged out of the Onboard Administrator' 		
    		)

  15. #15
    Membre habitué Avatar de korospoukine
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2006
    Messages : 176
    Points : 175
    Points
    175
    Par défaut
    Merci beaucoup.
    Cela marche nickel.

    Il ne me reste plus qu'à faire mes tests et mettre cela dans un job

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/02/2015, 09h17
  2. Comment supprimer deux lignes quelconques d'une matrice
    Par fahimonasri dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/07/2014, 12h02
  3. Remplacement avec Sed sur deux lignes successives
    Par Synack92 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 18/05/2014, 16h17
  4. Supprimer lignes successives ayant un champs identique
    Par anwarov dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/05/2012, 10h24
  5. Extraction de deux ligne successives
    Par africanwinners dans le forum Langage
    Réponses: 3
    Dernier message: 16/09/2011, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo