2017-09-26 13 views
0

J'ai un événement tabel de 10 Go dans la base de données MYSQL. Cela fait partie du serveur d'applications Web. La connexion à cette base de données n'a pas été bien configurée auparavant, donc je dois faire un singe table 'événement' plus mince. Ce que je veux dire, c'est que j'ai des journaux de valeurs de points de données (lignes) et un horodatage de cette valeur. Je ne peux pas tout supprimer, je dois être capable de créer un graphique à partir des valeurs qui resteront dans cette table. C'est pourquoi je dois laisser quelques données représentatives. Une idée est de supprimer des lignes avec le même datapId quand ts diff est plus petit que X ou peut-être supposé être construit sur pointValues ​​diff?Suppression de lignes dans MySQL à l'intérieur d'une table à l'aide de la condition d'horodatage

S'il vous plaît aidez-moi à construire une requête appropriée.

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<style> 
 
table, th, td { 
 
    border: 1px solid black; 
 
} 
 
</style> 
 
</head> 
 
<body> 
 

 
<table> 
 
    <tr> 
 
    <th>id</th> 
 
    <th>datapId</th> 
 
    <th>dataType</th> 
 
    <th>pointValue</th> 
 
    <th>ts</th> 
 
    </tr> 
 
    <tr> 
 
    <td>1</td> 
 
    <td>5194</td> 
 
    <td>1</td> 
 
    <td>1</td> 
 
    <td>15060882793523</td> 
 
    </tr> 
 
    <tr> 
 
    <td>2</td> 
 
    <td>5194</td> 
 
    <td>1</td> 
 
    <td>1.1</td> 
 
    <td>15060882793524</td> 
 
    </tr> 
 
    <tr> 
 
    <td>3</td> 
 
    <td>5194</td> 
 
    <td>1</td> 
 
    <td>2.25</td> 
 
    <td>15060882793560</td> 
 
    </tr> 
 
    <tr> 
 
    <td>4</td> 
 
    <td>5194</td> 
 
    <td>1</td> 
 
    <td>2.23</td> 
 
    <td>15060882793590</td> 
 
    </tr> 
 
    <tr> 
 
    <td>5</td> 
 
    <td>5194</td> 
 
    <td>1</td> 
 
    <td>0</td> 
 
    <td>15060882793620</td> 
 
    </tr> 
 
    
 
</table> 
 

 
</body> 
 
</html>

Répondre

0

Si je comprends bien votre question, une approche pourrait consister à essayer de construire une table avec des valeurs moyennes des données:

Essayez ceci (création de données de test):

CREATE TABLE data 
(
    id INT AUTO_INCREMENT PRIMARY KEY, 
    datapId INT, 
    dataType INT, 
    pointValue FLOAT, 
    ts BIGINT 
); 

INSERT INTO data VALUES (NULL,5194,1,1,15060882793523); 
INSERT INTO data VALUES (NULL,5194,1,1.1,15060882793524); 
INSERT INTO data VALUES (NULL,5194,1,2.25,15060882793560); 
INSERT INTO data VALUES (NULL,5194,1,2.23,15060882793590); 
INSERT INTO data VALUES (NULL,5194,1,0,15060882793620); 

Pour construire un tableau faisant la moyenne des valeurs sur @interval_count intervalles:

-- TODO: Manually set interval count 
SET @interval_count := 10; 
-- Find ts bounds from data 
SELECT @ts_min := min(ts) FROM data; 
SELECT @ts_max := max(ts) FROM data; 
SELECT @interval_size := (@[email protected]_min)/(@interval_count-1); 

SELECT 
    -- ts at center of range with width @interval_size 
    ts_c as ts_mean, 
    -- Average of values in this range 
    AVG(d.pointValue) as pointValue_mean 
FROM 
(
    -- Table with equally spaced ts points at range center 
    SELECT DISTINCT 
    -- ts value in the middle of the averaging range 
    ROUND(([email protected]_min)/@interval_size)*@[email protected]_min as ts_c 
    -- Lower bound for averaging range 
    ,ROUND(([email protected]_min)/@interval_size)*@[email protected][email protected]_size/2 
    -- Upper bound for averaging range 
    ,ROUND(1+([email protected]_min)/@interval_size)*@[email protected][email protected]_size/2 
    FROM data 
) d_c 
JOIN data d ON d.ts BETWEEN -- Self join to calculate average in ranges 
    ROUND(([email protected]_min)/@interval_size)*@[email protected][email protected]_size/2 AND 
    ROUND(([email protected]_min)/@interval_size)*@[email protected][email protected]_size/2 
GROUP BY 1 
ORDER BY 1 

Aucune idée si cela fonctionne sur 10 GB.

Vous pouvez l'essayer ici: http://sqlfiddle.com/#!9/612cf/1

+0

Enfin j'ai décidé de le faire de cette façon suivante, d'avoir moins de lignes, mais pour ne pas calculer la moyenne des données. J'ai énuméré tous les identifiants de point de données qui ont le plus de valeurs et je supprime tous les enregistrements pairs (basés sur des index autoincrémentés de table) de database.pointvalues ​​où dataPointId = 'X' et (id% 2) = 0; – user4201838