Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1849 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Requete SQL pour supprimer des enregistrements identiques

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MySQL] Requete SQL pour supprimer des enregistrements identiques

n°1320664
le_duc
PlaTyPuS
Posté le 08-03-2006 à 00:56:28  profilanswer
 

Yop!
 
J'ai une table de ce type:

Code :
  1. ----------------------------------------------------------
  2. | id       | idUser      | Date                | Statut   |
  3. ----------------------------------------------------------
  4. | 1        | 1           | 2005.11.15 10:xx:xx | 0        |
  5. | 2        | 1           | 2005.11.15 10:xx:xx | 0        |
  6. | 3        | 1           | 2005.11.15 10:xx:xx | 0        |
  7. | 4        | 1           | 2005.11.15 18:xx:xx | 0        |
  8. | 5        | 1           | 2005.11.15 18:xx:xx | 0        |
  9. | 6        | 1           | 2005.11.15 23:xx:xx | 1        |
  10. ----------------------------------------------------------


 
on peut voir qu'il y a des répétitions pour 1 seule heure --> genre 3 enregistrement à 10hxx, 2 à 18h
 
--> J'aimerais garder qu'un seul enregistrement par heure!
 
Ce qui donnerait la table suivante:

Code :
  1. ----------------------------------------------------------
  2. | id       | idUser       | Date               | Statut   |
  3. ----------------------------------------------------------
  4. | 1        | 1           | 2005.11.15 10:xx:xx | 0        |
  5. | 4        | 1           | 2005.11.15 18:xx:xx | 0        |
  6. | 6        | 1           | 2005.11.15 23:xx:xx | 1        |
  7. ----------------------------------------------------------


 
Pour l'instant j'essaie avec cette requete, mais j'y arrive pas...

Code :
  1. CREATE TABLE onlinestatstemp
  2.         AS SELECT id FROM onlinestats o1
  3.                                   WHERE EXISTS
  4.                                                 (SELECT 1 FROM onlinestats o2
  5.                                                                    WHERE DAYOFYEAR(o2.date) = DAYOFYEAR(o1.date)
  6.                                                                    AND HOUR(o2.date) = HOUR(o1.date)
  7.                                                                    AND o1.id>o2 .id);
  8. DELETE FROM onlinestats 
  9. WHERE id IN (SELECT id FROM onlinestatstemp);
  10. DROP TABLE onlinestatstemp;


 
Merci pour votre aide.
 
@++


Message édité par le_duc le 08-03-2006 à 00:57:11
mood
Publicité
Posté le 08-03-2006 à 00:56:28  profilanswer
 

n°1321061
dlaumor
Posté le 08-03-2006 à 16:27:13  profilanswer
 

faut passer par un group by sur l'heure et prendre le max id
 

Code :
  1. select max(id),idUser,  FORMAT(date, 'AAAA.MM.DD HH'), Statut
  2. from Table
  3. Group by idUser,  FORMAT(date, 'AAAA.MM.DD HH'), Statut


La fonction FORMAT faut adapter à ton SGBD en gros transformer ta date pour ne tenir compte que du jour et heure et oublier les minutes/secondes. je pense que tu vas pouvoir trouver la fonction en cherchant sur internet

Message cité 1 fois
Message édité par dlaumor le 08-03-2006 à 16:28:04
n°1321369
le_duc
PlaTyPuS
Posté le 08-03-2006 à 21:43:42  profilanswer
 

dlaumor a écrit :

faut passer par un group by sur l'heure et prendre le max id
 

Code :
  1. select max(id),idUser,  FORMAT(date, 'AAAA.MM.DD HH'), Statut
  2. from Table
  3. Group by idUser,  FORMAT(date, 'AAAA.MM.DD HH'), Statut


La fonction FORMAT faut adapter à ton SGBD en gros transformer ta date pour ne tenir compte que du jour et heure et oublier les minutes/secondes. je pense que tu vas pouvoir trouver la fonction en cherchant sur internet


 
euh.... pour la fonction FORMAT je dois trouver ca sans trop de problèmes...
 
par contre, je comprends pas pourquoi t'aimerais faire un group by sur l'heure! si tu peux préciser... merci.

n°1321432
mrbebert
Posté le 08-03-2006 à 22:22:45  profilanswer
 

Je pense que tu peux supprimer tous les enregistrements qui ne sont pas le minimum pour une heure donnée. Un truc du genre :
DELETE FROM ta_table
WHERE Date NOT IN (
  SELECT MIN(Date) FROM ta_table GROUP BY FORMAT(date, 'AAAA.MM.DD HH')
)
 
On liste la date minimum pour chaque heure (à voir pour le "format" ), et on supprime tout le reste :)
 
(par contre, il peut rester des doublons si les dates sont complètement identiques, à la seconde près [:proy] )


Message édité par mrbebert le 08-03-2006 à 22:25:33
n°1321511
le_duc
PlaTyPuS
Posté le 09-03-2006 à 01:08:32  profilanswer
 

euhhh ouais, mais moi je veux garder 1 seule heure, mais pour chaque idUser!
 
genre:

Code :
  1. ----------------------------------------------------------
  2. | id       | idUser      | Date                | Statut   |
  3. ----------------------------------------------------------
  4. | 1        | 1           | 2005.11.15 10:xx:xx | 0        |
  5. | 2        | 2           | 2005.11.15 10:xx:xx | 0        |
  6. | 4        | 1           | 2005.11.15 18:xx:xx | 0        |
  7. | 5        | 2           | 2005.11.15 18:xx:xx | 0        |
  8. ----------------------------------------------------------


 
ca marcherait avec le group by?? vais test...

n°1321514
le_duc
PlaTyPuS
Posté le 09-03-2006 à 02:04:11  profilanswer
 

avec ca, je peux récupérer le jour de l'année, suivi directement de l'heure!
 

Code :
  1. SELECT DATE_FORMAT(date, '%j%k') FROM onlinestats

n°1321542
dlaumor
Posté le 09-03-2006 à 09:07:17  profilanswer
 

le_duc a écrit :

euh.... pour la fonction FORMAT je dois trouver ca sans trop de problèmes...
 
par contre, je comprends pas pourquoi t'aimerais faire un group by sur l'heure! si tu peux préciser... merci.


 
 
Le group by sur l'heure (enfin jour + heure) puisque c'est ça qui t'intéresse. D'avoir un enregistrement par heure
 
 
et comme tu veux aussi un enregistrement par userid tu group by sur le USERID
 

Code :
  1. select Max(id), idUser, DATE_FORMAT(date, '%j%k')
  2. from onlinestats
  3. group by idUser, DATE_FORMAT(date, '%j%k')


 
Qu'est ce que tu veux garder comme statut ?? si tu as des statuts différents pour une même heure et un même IdUser ?


Message édité par dlaumor le 09-03-2006 à 09:12:42
n°1321605
le_duc
PlaTyPuS
Posté le 09-03-2006 à 10:22:46  profilanswer
 

yop yop!
 
non, en fait c'est bon :). j'ai testé hier soir et ca fonctionne nickel ;).
 
Merci beaucoup pour votre  aide!!!
 
@++
 
requete que j'utilise:

Code :
  1. SELECT MAX(id), idProprios, DATE_FORMAT(date, "%j%k" ), UNIX_TIMESTAMP(date) as "date", online
  2. FROM onlinestats
  3. GROUP BY DATE_FORMAT(date, "%j%k" )
  4.         ORDER BY date


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Requete SQL pour supprimer des enregistrements identiques

 

Sujets relatifs
[XQuery]Problème de requêterequete récursive sql
[MySQL] Quel type de champ pour quel type de données ?[mysql] Comment effacer plusieurs tables à la fois ?
[ MySQL ] Requête imbriquée ???Problème d'import SQL Server 2005 (DTS)
fichier .odt indexé sur table mysql et en phpcomposer une bdd mysql pour creer une plate forme de blog ?
Une varible PHP dans du SQL ? 
Plus de sujets relatifs à : [MySQL] Requete SQL pour supprimer des enregistrements identiques


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR