5

我有数十万个跨越 40 年的价格点。我想构建一个只返回 3000 个总数据点的查询,最后 500 个是最近的数据点,另外 2500 个只是其余数据的样本,均匀分布。

是否可以在一个查询中执行此操作?我将如何只选择大量数据的样本?这是我仅获取其他 2500 个数据点的样本的一个小示例:

1
2
3    
4
5
6
7
8
9
10

我想返回这样的东西:

1
5
10

这是最后 500 个的查询:

SELECT * FROM price ORDER BY time_for DESC LIMIT 500

我不确定如何从其他数据点获取样本数据。

4

2 回答 2

5

尝试这个:

(SELECT * FROM price ORDER BY time_for DESC LIMIT 500)
UNION ALL
(SELECT * FROM price WHERE time_for < (SELECT time_for FROM price ORDER BY time_for LIMIT 500, 1) ORDER BY rand() LIMIT 2500)
ORDER BY time_for

注意:它可能会很慢。这张桌子有多大?

仅从所有这些行中获取主 ID,然后在缩小范围后将其连接到辅助查询中的原始 ID 可能会更快。这是因为必须对整个ORDER BY rand() LIMIT进行排序。如果表很大,这可能需要很长时间,并且需要大量磁盘空间。仅检索 ID 会减少必要的磁盘空间。

于 2012-09-06T04:44:00.220 回答
3

前面的答案很好,但是您确实指定了希望结果均匀分布,所以我也会添加这种可能性。通过在行上迭代计数器,您可以使用 MOD 运算符对均匀分布进行采样。我现在没有安装 MYSQL 来测试它,如果语法不是 100% 正确,我深表歉意。但它应该足够接近,可能会给你一些想法。

  (  SELECT p1.*
       FROM price p1
   ORDER BY p1.time_for DESC
      LIMIT 500  )

   UNION ALL

  (  SELECT @i := @i + 1 AS row_num,
            p2.*
       FROM price p2,
            (SELECT @i: = 0)
      WHERE row_num > 500
        AND (row_num % 500) = 0
   ORDER BY time_for DESC  )

第一个查询给出了最新的 500 行。第二个查询之后每 500 行给出一次,从而从其余数据返回均匀分布。显然,您可以调整此参数以实现所需的样本间距。或者根据表中的总行数来计算必要的间距,以准确给出 2500 条记录。

于 2012-09-10T13:59:28.870 回答