使用时间戳条件在一个表中删除MySQL中的行

时间:2017-09-26 08:01:00

标签: mysql sql timestamp delete-row

我在MYSQL数据库中有10 GB的tabel事件。它是Web应用程序服务器的一部分。以前没有很好地配置登录此数据库,所以我需要制作一个单一的表格' event'更薄。 我的意思是我有数据点值日志(行)和此值的时间戳。 我不能删除所有,我需要能够从将保留在此表中的值创建图表。这就是我需要留下一些代表性数据的原因。

一个想法是当ts diff小于X时删除具有相同datapId的行,或者它应该在pointValues diff上构建?

请帮我构建正确的查询。



Cipher.Init




1 个答案:

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