从一组mysql记录中选择一组分布的样本记录

wixjitnu  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(364)

我有一个表,表中有很多行,行以每分钟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中是否有一个函数或什么东西可以处理这个问题。
edit here是我尝试过的查询,现在可以用了,但是我希望结果分布更均匀,而不是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;
7y4bm7vi

7y4bm7vi1#

不要将order by rand()作为为每一行计算的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\u timestamp(created)%60=0)”的内容,这与您想要的略有不同,但也可以(取决于insert发行版)

相关问题