嗨,我想知道如何随机选择一组 2% 的所有行。 我知道我们可以这样做:"限制100"。 但这里的挑战是表格大小会发生变化,但我总是希望随机占总行数的 2%,向上或向下舍入都可以。 该表的每一行都有唯一的 ID。 有谁知道该怎么做?
SET @size := CEILING(0.02*(SELECT COUNT(*) FROM orders));
SELECT
*
FROM
`orders`
ORDER BY RAND()
LIMIT (SELECT @size)
我尝试使用会话变量,但最后一行似乎不起作用(限制(选择 @size((
在 MYSQL 8+ 中,您可以使用 ROW_NUMBER()
函数为每行指定行号,然后仅选择行号小于最大行号 * 0.02(即 2% 的行(的行。例如:
WITH cte AS
(SELECT *, ROW_NUMBER() OVER (ORDER BY RAND()) AS rn
FROM orders),
cte2 AS
(SELECT MAX(rn) AS numrows FROM cte)
SELECT *
FROM cte
JOIN cte2
WHERE rn < numrows * 0.02
这是使用数字表的dbfiddle演示。
在MySQL 5.x中,您可以使用变量或JOIN
来模拟ROW_NUMBER()
函数。这个问题的答案给出了如何做到这一点的很好的例子。