如何在mysql中随机选择2%的行?

时间:2020-07-31 08:35:18

标签: mysql sql

如何从MySQL的表中随机抽取2%的样本?

我尝试了以下查询

SELECT orderID
    FROM orders
    ORDER BY rand() 
    LIMIT 1 OFFSET (SELECT convert(0.02 * count(*), unsigned) FROM orders)
;

SELECT orderID
    FROM orders
    ORDER BY rand() 
    LIMIT (SELECT convert(0.02 * count(*), unsigned) FROM orders)
;

他们两个都给出错误。有人可以解释错误和其他方法。

数据库:Northwind

MySQL版本:8.0

3 个答案:

答案 0 :(得分:3)

我会在这里使用ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY RAND()) rn, COUNT(*) OVER () cnt
    FROM orders
)

SELECT *
FROM cte
WHERE rn < 0.02 * cnt;  -- select first 2% of a random sample

答案 1 :(得分:1)

如果大约 2%足够,那么您可以使用:

SELECT orderID
FROM orders
WHERE rand() <= 0.02;

因为不需要排序,这可能是最快的方法。

请注意,结果并不是精确 2%,但是在一张大桌子上,结果将足够接近。

答案 2 :(得分:0)

您可以使用MySQL存储过程在MySQL内部创建函数。 https://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx/

CREATE PROCEDURE GetRand2PercentSample()
BEGIN
    DECLARE nLimit INT DEFAULT 0;
    
    SELECT COUNT(*) * 0.2
    INTO nLimit
    FROM orders;
    
    SELECT * FROM orders ORDER BY RAND() LIMIT nLimit;
END

// to call the function
call GetRand2PercentSample()