Select 来自 MySQL 组许多记录的分布式样本记录集

Select a distributed sample set of records from a MySQL set of many records

我有一个 table,里面有很多行,每分钟出现 400-500 行(我知道这不是很多),但我需要做一些排序'trend' 对过去 1 分钟内收集的数据的分析。

我真的希望能够 select,比如 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 条记录从集合中提取一行(大约 500 行返回 10 行)。

这不需要很精确,我只需要一个样本来执行某种线性回归。

这可能吗?如果需要,我可以在我的应用程序代码中执行此操作,但我想看看 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;

不要按 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

创建的索引是 "the must"。

此外,您可能会考虑使用 'AND (UNIX_TIMESTAMP(created) % 60 = 0)' 之类的东西,它与您想要的略有不同,但可能没问题(取决于您的插入分布)