从多个记录的MySQL集合中选择一个分布式记录样本集

时间:2018-12-14 03:30:06

标签: mysql distribution sample

我有一个表,其中有很多行,行以每分钟400-500的速度发生(我知道这不是很多),但是我需要对表进行某种“趋势”分析最近1分钟内收集的数据。

我真的希望能够选择10条记录,这些记录在指定的时间段内以某种程度甚至均匀的分布发生,而不是提取已输入的所有记录然后再处理每个记录。

ID       DEVICE_ID       LA         LO          CREATED         
-------------------------------------------------------------------
1           1           23.4        948.7       2018-12-13 00:00:01
2           2           22.4        948.2       2018-12-13 00:01:01
3           2           28.4        948.3       2018-12-13 00:02:22
4           1           26.4        948.6       2018-12-13 00:02:33
5           1           21.4        948.1       2018-12-13 00:02:42
6           1           22.4        948.3       2018-12-13 00:03:02
7           1           28.4        948.0       2018-12-13 00:03:11
8           2           23.4        948.8       2018-12-13 00:03:12
...                                                             
492         2           21.4        948.4       2018-12-13 00:03:25
493         1           22.4        948.2       2018-12-13 00:04:01
494         1           24.4        948.7       2018-12-13 00:04:02
495         2           27.4        948.1       2018-12-13 00:05:04

考虑到此数据集,我不希望提取所有这些行,而希望每50条记录从数据集中提取一行(返回10行,大约返回500行)。

这不一定是精确的,我只需要一个样本即可在其中执行某种线性回归。

这甚至可能吗?如果需要,我可以在我的应用程序代码中完成此操作,但是我想查看MySQL中是否有可以处理此问题的函数或内容。

修改 这是我尝试过的查询,目前可以使用-但我希望结果分配更均匀,而不是RAND()。

SELECT * FROM (
SELECT * FROM (
SELECT t.*, DATE_SUB(NOW(), INTERVAL 30 HOUR) as offsetdate

from tracking t
HAVING created > offsetdate) as parp
ORDER BY RAND()
LIMIT 10) as mastr
ORDER BY id ASC;

1 个答案:

答案 0 :(得分:1)

不要按RAND()进行排序,因为兰特是为每一行计算的,然后重新排序,只有这样,您才可以选择一些记录。

您可以尝试以下操作:

SELECT
    *
FROM
    (
        SELECT
            tracking.*
            , @rownum := @rownum + 1 AS rownum
        FROM
            tracking
            , (SELECT @rownum := 0) AS dummy
        WHERE
            created > DATE_SUB(NOW(), INTERVAL 30 HOUR)
    ) AS s
WHERE
    (rownum % 10) = 0

创建时的索引是“必须”。

此外,您可能会考虑使用类似于“ AND(UNIX_TIMESTAMP(已创建)%60 = 0)”之类的内容,该内容与您想要的内容略有不同,但是可能还可以(取决于您的插入分布)