2017-09-26 6 views
0

MYSQLデータベースに10 GBのtabelイベントがあります。これはWebアプリケーションサーバーの一部です。このデータベースへのログインは以前はうまく構成されていなかったので、私は単一のテーブル 'イベント'をシンナーにする必要があります。 私は、この値のデータポイント値のログ(行)とタイムスタンプがあることを意味します。 私はすべてを削除することはできません、私はこの表に残る値からグラフを作成することができます。それで私はいくつかの代表的なデータを残す必要があるのです。タイムスタンプ条件を使用して1つのテーブル内でMySQLの行を削除

1つのアイデアは、ts diffがXより小さいか、またはpointValues diffでビルドされていると思われる場合、同じdatapIdを持つ行を削除することです。

適切なクエリを作成するのを手伝ってください。この(テストデータを作成)してみ

:私はあなたの質問を理解していれば

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

答えて

0

、1つのアプローチは、試してみて、データの平均値を持つテーブルを構築することであるかもしれない

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

@interval_count間隔の値を平均化するテーブルを作成するには:

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

これが10 GBで動作するかどうかはわかりません。

あなたがここでそれを試すことができます。http://sqlfiddle.com/#!9/612cf/1

+0

を最後に、私はあまり行を持って、この次の方法を行うことを決めたが、データから平均値を計算しないように。私はほとんどの値を持つすべてのデータポイントIDを列挙し、dataPointId = 'X'および(id%2)= 0のdatabase.pointvaluesからすべての偶数(テーブルの自動インクリメントインデックスに基づく)を削除します。 – user4201838

関連する問題