2017-10-12 4 views
0

c'est la continuation du poste need database hourly data before two monthscomment supprimer et mettre à jour les lignes lorsque les données converetd mins à quelques heures dans la base

hostname    | cpuload | freedisk | freemem |timestamp 
localhost.localdomain | 0.15 | 136052 | 383660 | 2017-08-01 00:10:08 
localhost.localdomain | 0.03 | 136492 | 383660 | 2017-08-01 00:20:08 
localhost.localdomain | 0.01 | 133456 | 383660 | 2017-08-01 00:30:08 
localhost.localdomain | 0.10 | 64544  | 383660 | 2017-08-01 00:40:08 
localhost.localdomain | 0.01 | 68148  | 383660 | 2017-08-01 01:00:08 

sortie obtenue est

hostname    cpuload  freedisk  freemem 
------------------------------------------------------------- 
localhost.localdomain 0.072500 117636.0000 383660.0000 
localhost.localdomain 0.010000 68148.0000 383660.0000 

i utilisé requête

SELECT t1.hostname 
    ,avg(cpuload) AS cpuload 
    ,avg(freedisk) AS freedisk 
    ,avg(freemem) AS freemem 
FROM table1 t1 
WHERE t1.TIMESTAMP < current_timestamp - interval '42' day 
GROUP BY date_format(t1.TIMESTAMP, '%Y%m%d%H'); 

Ici, je veux insérer les résultats obtenus à la même table et del il ya 2 mois les données où nous avons fait l'opération.

S'il vous plaît aidez-moi

Merci à l'avance

Sagar Reddy

+0

si vous voulez insérer et supprimer .. n'est pas clair si vous annulez les données insérées .. expliquer mieux vous besoin s'il vous plaît – scaisEdge

+0

ici mon souci est que j'insère des données pour chaque 10 minutes. par heure 4 enregistrements. par jour 96. pour deux mites 96 * 60. de sorte que je veux convertir en moyenne d'heures. donc converti en heures. les données obtenues maintenant doivent être mises à jour dans la même table et les données de min doivent être supprimées. –

+0

@sagarreddy: Les lignes nouvellement insérées ont des valeurs 'null' dans la colonne' timestamp'. – zarruq

Répondre

0

Vous pouvez insérer nouvellement généré des données en utilisant insert-select comme ci-dessous.

insert into table1 
SELECT t1.hostname 
    ,avg(cpuload) AS cpuload 
    ,avg(freedisk) AS freedisk 
    ,avg(freemem) AS freemem, 
    date_format(t1.TIMESTAMP, '%Y-%m-%d %H')as timestamp 
FROM table1 t1 
WHERE t1.TIMESTAMP < current_timestamp - interval '42' day 
GROUP BY date_format(t1.TIMESTAMP, '%Y%m%d%H'); 

Après l'insertion, la table ressemblera à ci-dessous.

hostname    cpuload freedisk freemem timestamp 
--------------------------------------------------------------------------- 
localhost.localdomain 0.15  136052  383660 01.08.2017 00:10:08 
localhost.localdomain 0.03  136492  383660 01.08.2017 00:20:08 
localhost.localdomain 0.01  133456  383660 01.08.2017 00:30:08 
localhost.localdomain 0.10  64544  383660 01.08.2017 00:40:08 
localhost.localdomain 0.01  68148  383660 01.08.2017 01:00:08 
localhost.localdomain 0.07  117636  383660 01.08.2017 00:00:00 
localhost.localdomain 0.01  68148  383660 01.08.2017 01:00:00 

DEMO

Vous pouvez ensuite supprimer les anciennes données à l'aide ci-dessous requête.

DELETE 
FROM table1 
WHERE TIMESTAMP NOT IN (
     SELECT TIMESTAMP 
     FROM (
      SELECT date_format(t1.TIMESTAMP, '%Y-%m-%d %H:00:00') AS TIMESTAMP 
      FROM table1 t1 
      WHERE t1.TIMESTAMP < current_timestamp - interval '42' day 
      GROUP BY date_format(t1.TIMESTAMP, '%Y%m%d%H') 
      ) x 
     ); 

Veuillez noter que votre table ne pas une colonne d'insertion timestamp ou tout autre en utilisant les lignes peuvent être identifiées, la requête ci-dessus est écrit sur l'hypothèse que votre table ne contient pas l'horodatage exacte du nouvelles lignes générées.


Mise à jour 1:

Si vous souhaitez supprimer des données pour une période de temps spécifique, vous pouvez le mentionner dans la clause where comme ci-dessous.

DELETE 
FROM table1 
WHERE TIMESTAMP NOT IN (
     SELECT TIMESTAMP 
     FROM (
      SELECT date_format(t1.TIMESTAMP, '%Y-%m-%d %H:00:00') AS TIMESTAMP 
      FROM table1 t1 
      WHERE t1.TIMESTAMP < current_timestamp - interval '42' day 
      GROUP BY date_format(t1.TIMESTAMP, '%Y%m%d%H') 
      ) x 
     ) 
    AND TIMESTAMP BETWEEN '2017-08-01 00:00:00' 
     AND '2017-09-30 11:00:00'; 

Espérons que cela vous donnera une idée :-)

DEMO

+0

si ces données sont là dans le tableau insérer dans les valeurs table1 ('localhost.localdomain', 0.01,68148, 383660, '2017-10-12 01:00:08'); il ne devrait pas supprimer les données des deux derniers mois. Merci . Je vais vérifier –

+0

cette ligne sera supprimée.Seules les lignes ayant la valeur 'timestamp' exacte des lignes nouvellement insérées ne seront pas supprimées. Vous pouvez également restreindre la suppression à une certaine période en introduisant une clause 'where' comme l'instruction' select' – zarruq

+0

@sagarreddy: vérifiez la mise à jour en réponse. – zarruq