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

Développement SQL Server Discussion :

Supprimer tous les enregistrements sauf 5


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut Supprimer tous les enregistrements sauf 5
    Bonjour,

    Voici mon contexte (je schématise juste mon problème):
    J'ai une table du type:
    rowId personneId strAction

    rowId: cle primaire auto incremente
    personneId: identifiant
    strAction: chaine de caractere

    Type d'enregistrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    1:0123:xxxx
    2:0123:xxxx
    3:0123:xxxx
    4:0456:xxxx
    5:0456:xxxx
    6:0123:xxxx
    7:0789:xxxx
    ...
    ...
    ...
    120000000:0123:xxxx
    ...
    Ce que je veux faire:
    Supprimer tout les éléments de la table sauf les 5 derniers d'un même id.

    La bd fonctionne sous forme de roulement, les enregistrements les plus vieux sont supprimés.
    Sauf que les personnes ne font pas tous autant d'actions dans le même laps de temps.

    Par exemple:
    0123 fera par exemple 10.000 actions par mois
    0456 fera par exemple 100 actions par mois
    0789 fera par exemple 1 actions par mois

    Le nombre de personne est variable [1 ; beaucoup].
    Le nombre d'actions est variable [1 ; a très beaucoup].

    Et je souhaite garder les 5 dernières actions de chacun. (Le 5 est arbitraire, je dois garder suivant les projets de 1 à 10 valeurs).

    Je ne trouve pas de moyen simple d'y parvenir.
    Et je me retrouve a essayer de passer par une table intermédiaire avec des requêtes de fou.

    Avant de continuer ma galère, j'aurai aimé savoir si je suis pas passé à cote de quelque chose.
    Est-ce que c'est possible de faire ce que je veux simplement?

    Je prend toutes les pistes

    Merci


    PS: je suis sous MS-SQL Server 2005

  2. #2
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut Est ce que ceci conviendrait ?
    Bonsoir,

    Est ce que ceci conviendrait ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    delete from tb
    where rowid in
    (
    select rowid from tb A
    join 
    (select personnelid, MAX(rowid) as rowid_max  from tb group by personnelid) personnel
    on  A.personnelid = personnel.personnelid
    where 
    	rowid <=  personnel.rowid_max - 5 
    )
    @+

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Merci, mais non, ça ne fonctionne pas.
    Il me supprime tous sauf les 5 derniers enregistrement (indépendamment des id).

    En fait il faudrait déjà que je puisse sélectionner les 5 derniers enregistrement pour chaque id. Et à partir de la, ce serait bon.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DELETE FROM Matable
    WHERE  RowId IN (SELECT RowId
                     FROM   (SELECT *, ROW_NUMBER() OVER(PARTITION BY PersonneID ORDER BY RowId DESC) AS N
                             FROM   MaTable) 
                     WHERE N > 5)
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Les premiers tests sont concluants.

    Merci beaucoup SQLpro pour cette solution aussi simple qu'efficace.

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

Discussions similaires

  1. [Shell] Supprimer tous les fichiers sauf XX et YY
    Par 84mickael dans le forum Linux
    Réponses: 9
    Dernier message: 25/07/2007, 10h37
  2. Réponses: 3
    Dernier message: 13/05/2007, 10h36
  3. Supprimer tous les enregistrements
    Par nicolasferraris dans le forum ASP
    Réponses: 4
    Dernier message: 29/11/2006, 08h56
  4. Sélection de tous les enregistrements sauf le dernier
    Par Tonio_35 dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/07/2006, 17h59
  5. [VBA Excel] supprimer tous les onglets sauf un
    Par drinkmilk dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/11/2005, 18h11

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