我在MYSQL数据库中有10 GB的tabel事件。它是Web应用程序服务器的一部分。以前没有很好地配置登录此数据库,所以我需要制作一个单一的表格' event'更薄。 我的意思是我有数据点值日志(行)和此值的时间戳。 我不能删除所有,我需要能够从将保留在此表中的值创建图表。这就是我需要留下一些代表性数据的原因。
一个想法是当ts diff小于X时删除具有相同datapId的行,或者它应该在pointValues diff上构建?
请帮我构建正确的查询。
Cipher.Init

答案 0 :(得分:0)
如果我理解你的问题,一种方法可能是尝试建立一个包含数据平均值的表格:
试试这个(创建测试数据):
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 := (@ts_max-@ts_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((ts-@ts_min)/@interval_size)*@interval_size+@ts_min as ts_c
-- Lower bound for averaging range
,ROUND((ts-@ts_min)/@interval_size)*@interval_size+@ts_min-@interval_size/2
-- Upper bound for averaging range
,ROUND(1+(ts-@ts_min)/@interval_size)*@interval_size+@ts_min+@interval_size/2
FROM data
) d_c
JOIN data d ON d.ts BETWEEN -- Self join to calculate average in ranges
ROUND((ts_c-@ts_min)/@interval_size)*@interval_size+@ts_min-@interval_size/2 AND
ROUND((ts_c-@ts_min)/@interval_size)*@interval_size+@ts_min+@interval_size/2
GROUP BY 1
ORDER BY 1
不知道这是否适用于10 GB。
您可以在此处试用:http://sqlfiddle.com/#!9/612cf/1