SQL:仅从大型数据集中获取采样数据

时间:2014-11-05 14:51:52

标签: mysql sql sample

所以我使用这个SQL从服务器获取了大量数据:

SELECT value,DATE_FORMAT(`time`,'%Y-%m-%dT%H:%i:%sZ') AS `time` 
  FROM history WHERE :id=reference AND 
  (time BETWEEN :start AND :end) ORDER BY time LIMIT 100 ";

限制设置为固定的100个条目。

但在给定的时间范围内,可能有5000个条目。

这是我的目标:我想在每个条目之间按时间对这些条目进行抽样。 因此,例如,每个条目之间的间隔将是60秒(让我们说它是参数),然后我将收到100个条目(从5000开始),但每个条目之间总是有一分钟的差异。

E.g。

value1,14:40:40
value2,14:41:40
...
value100,16:20:40

这可以通过SQL实现吗?或者我是否必须使用PHP解析这些大数据?

如果仅使用SQL不可行,是否有可能在这5000个条目中平均分配这100个条目? (所以不是时间,但我得到固定的条目id1,id50,id100,id150,...,id5000)。再次使用sql。

谢谢!

2 个答案:

答案 0 :(得分:2)

就像Kristof在他的回答中所说的那样:订购行并通过应用行号来获取每一行。这是在MySQL中完成的方式:

select 
  rows.value,
  date_format(rows.`time`,'%Y-%m-%dT%H:%i:%sZ') AS `time` 
from
(
  select 
    @row_number := @row_number + 1 as row_number,
    history.*
  from history 
  cross join (select @row_number := 0) as t
  where reference = :id and `time` between :start and :end
  order by `time`
) as rows
cross join 
(
  select count(*) as cnt
  from history 
  where reference = :id and `time` between :start and :end
) as rowcount
where mod(rows.row_number - 1, ceil(rowcount.cnt / 100)) = 0;

这就是使用分析函数在另一个dbms(例如Oracle)中看起来的情况:

select 
  rows.value,
  to_char(rows."time",'yyyy-mm-dd hh24:mi:ss') AS "time" 
from
(  
  select 
    row_number() over (order by "time") as rown,
    count(*) over () as cnt,
    history.*
  from history
  where reference = :id and "time" between :start and :end
) rows
where mod(rows.rown - 1, ceil(rows.cnt / 100)) = 0;

这些查询会产生100条记录或更少的记录,具体取决于表中包含的行数。您还可以在MySQL中使用TRUNCATE(rowcount.cnt,0)而不是CEIL(rowcount.cnt),从而获得数百行或更多行,并另外应用LIMIT 100来获得恰好100行(前提是至少有100行)表)。

答案 1 :(得分:0)

你可以选择rowNumber并计算该rowNumber的模数。 不知道如何在mysql中完成它,但是t-sql是这样的:

SELECT ROW_NUMBER() over( order by idField) % 50 as selector, * 
FROM history
WHERE selector = 1

这将计算行数并每隔50条记录重置一次计数器,为您提供展开结果。

相关问题