2017-09-26 2 views
0

Ich habe 10 GB Tabellenereignis in MYSQL-Datenbank. Es ist Teil des Webanwendungsservers. Das Anmelden in dieser Datenbank war vorher nicht gut konfiguriert, daher muss ich eine einzige Tabelle "Event" dünner machen. Was ich meine ist, ich habe Datenpunkte Werte Protokolle (Zeilen) und Zeitstempel dieses Wertes. Ich kann nicht alle löschen, ich musste Diagramm aus Werten erstellen, die in dieser Tabelle bleiben. Deshalb muss ich einige repräsentative Daten hinterlassen.Löschen von Zeilen in MySQL in einer Tabelle mit Zeitstempelbedingung

Eine Idee ist es, Zeilen mit demselben Datapid zu löschen, wenn ts diff kleiner als X ist oder vielleicht in pointValues ​​diff eingebaut werden soll?

Bitte helfen Sie mir, richtige Abfrage zu konstruieren.

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

Antwort

0

Wenn ich Ihre Frage verstehen, könnte ein Ansatz sein, um zu versuchen, eine Tabelle mit Mittelwerten der Daten aufbauen:

die Sie interessieren (Testdaten erstellen):

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); 

Um eine Tabelle zu erstellen, die die Werte auf @interval_count intervalliert:

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

Keine Ahnung, ob dies auf 10 GB funktioniert.

Sie können es hier versuchen: http://sqlfiddle.com/#!9/612cf/1

+0

Schließlich habe ich beschlossen, diese folgende Art und Weise zu tun, weniger Reihen zu haben, aber nicht aus den Daten berechnen Durchschnitt. Ich habe alle Datenpunkt-ID aufgelistet, die die meisten Werte hat, und ich lösche alle geraden (basierend auf autoincrementierten Tabellenindizes) redrods aus database.pointvalues, wobei dataPointId = 'X' und (id% 2) = 0; – user4201838

Verwandte Themen