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)' 之类的东西,它与您想要的略有不同,但可能没问题(取决于您的插入分布)
我有一个 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)' 之类的东西,它与您想要的略有不同,但可能没问题(取决于您的插入分布)