[MySQL] Requete SQL pour supprimer des enregistrements identiques

Requete SQL pour supprimer des enregistrements identiques [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 08-03-2006 à 00:56:28    

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
Reply

Marsh Posté le 08-03-2006 à 00:56:28   

Reply

Marsh Posté le 08-03-2006 à 16:27:13    

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
Reply

Marsh Posté le 08-03-2006 à 21:43:42    

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.

Reply

Marsh Posté le 08-03-2006 à 22:22:45    

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
Reply

Marsh Posté le 09-03-2006 à 01:08:32    

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...

Reply

Marsh Posté le 09-03-2006 à 02:04:11    

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

Reply

Marsh Posté le 09-03-2006 à 09:07:17    

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
Reply

Marsh Posté le 09-03-2006 à 10:22:46    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed